let rectangles =
[(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <- [1..10],a+b+c+d == 22]
У меня есть этот код, который работает, но я хочу сделать это функцией, чтобы я мог изменить значение 22
Всего 1 ответ
Просто добавьте имя аргумента после rectangles
и используйте это вместо 22. Пример:
let rectangles perimeter = [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <-[1..10],
a+b+c+d == perimeter]
Дополнительная информация
Если вам интересно, вы можете написать функцию Haskell несколькими способами, но только некоторые из них применимы в каждом контексте.
Чтобы определить глобальную функцию, вы опускаете let (и удостоверяетесь, что строка (-ы) не является частью и не является частью какого-либо другого определения).
rectangles perimeter = [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <- [1..10],
perimeter == a+b+c+d]
Внутри определения синтаксис тот же, но окруженный let
.. in
.
squares = let
sidelengths ceil = [1..ceil]
in
[ (a,a,a,a) | a <- sidelengths 10 ]
Если вам не нравится, вы можете использовать let
внутри:
squares = do
let sidelengths ceil = [1..ceil]
[ (a,a,a,a) | a <- sidelengths 10 ]
Наконец, в каждом случае вы также можете переместить имя аргумента справа от знака равенства, если вы окружаете его с помощью и
->
.
let rectangles = perimeter->
[(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <-[1..10],
a+b+c+d == perimeter]