难以理解的功能定义

时间:2015-10-07 16:45:01

标签: function haskell functional-programming currying

cube (x,y,z) =
  filter (pcubes x) cubes


cubes = [(a,b,c) | a <- [1..30],b <- [1..30],c <- [1..30]]


pcubes x (b,n,m) = (floor(sqrt(b*n)) == x)

所以这段代码有效,cubes生成元组列表,pcubes与过滤器一起用来过滤满足floor(sqrt(b*n)) == x的所有多维数据集,但修改了我的代码的人写了{{ 1}}在pcubes x中,这是如何工作的。filter (pcubes x) cubes创建一个函数,它将初始化pcubes x,它将接收一个元组并输出一个bool.bool将用于过滤功能。这种操纵是如何发生的? cubes x (b,n,m)如何访问函数的pcubes x部分?

1 个答案:

答案 0 :(得分:4)

在Haskell中,我们通常不使用元组(即:(a,b,c))将参数传递给函数。我们使用 currying

以下是一个例子:

add a b = a + b

这里add是一个带数字的函数,返回另一个带数字的函数,然后返回一个数字。我们代表它的类型:

add :: Int -> (Int -> Int)

由于->的行为方式,我们可以在这种情况下删除括号:

add :: Int -> Int -> Int

它被称为:

(add 1) 2

但由于应用程序的工作方式,我们可以写:

add 1 2

这看起来不像我们上面的定义add a b ......?

您的功能pcubes类似。这是我写的方式:

pcubes x (b,n,m) = floor (sqrt (b*n)) == x

正如其他人所说,它的类型可以表示为:

pcubes :: Float -> (Float, Float, Float) -> Bool 

当我们写pcubes 1时,类型变为:

pcubes 1 :: (Float, Float, Float) -> Bool

通过currying,这是合法的,并且可以很乐意在其他地方使用。

我知道,这是一个疯狂的黑色功能魔法,就像我一样,但不久我保证你永远不想回去:curried功能很有用。

有关元组的注释:(a,b,c)之类的表达式数据。它们不是纯粹的函数参数表达式。我们可以把它拉成一个函数这个事实被称为模式匹配,虽然我轮到我了。