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
部分?
答案 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)
之类的表达式数据。它们不是纯粹的函数参数表达式。我们可以把它拉成一个函数这个事实被称为模式匹配,虽然我轮到我了。