let rectangles =
[(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <- [1..10],a+b+c+d == 22]
我有可以运行的代码,但我想将此功能用作函数,所以我可以更改22的值
答案 0 :(得分:2)
只需在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 ]
如果您不喜欢in
,则可以在let
中使用do
:
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]