如何在Haskell中使用let语句获取子集总和的组合?

时间:2018-10-23 15:16:18

标签: haskell

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 个答案:

答案 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]