我是Haskell的新手,我正在进行一些函数式编程工作.
以下是如何指定查找两个数字的最大值的示例:
max :: Integer -> Integer -> Integer max x y | x >= y = x | otherwise = y max' :: Integer -> Integer -> Integer max' x y = if x >= y then x else y prop_max1 :: Integer -> Integer -> Bool prop_max1 x y = x <= max x y && y <= max' x y
我想使用这个prop_max1
函数,所以我写:
prop_max1 (max 1 2) (max' 1 2)
返回True
.
但如果我写
prop_max1((max 1 2) (max' 1 2))
这不起作用,我得到一个与预期类型不匹配的错误.为什么我不能这样写呢?
如果您熟悉Python,Ruby,Java或C#,通常会调用函数:
func(a, b)
在Haskell,F#和OCaml中,它们被调用如下:
func a b
这意味着Haskell a-la a b
中的另一个术语后跟另一个术语是a(b)
Python中的函数调用a-la .
这基本归结为:
prop_max1 (max 1 2) (max' 1 2) -- is the same as prop_max1(max(1, 2), max'(1, 2))
而
prop_max1 ((max 1 2) (max' 1 2)) -- is the same as prop_max1(max(1, 2)(max'(1, 2))))
请注意放置方式的不同之处prop_max1(max(1, 2), max'(1, 2))
和prop_max1(max(1, 2)(max'(1, 2))))
不同之处()
.
附注:一个看起来像这样的函数调用:f(a)(b)
基本上与此相同:
g = f(a) g(b)
但是作为单一陈述书写,意思max(1, 2)(max'(1, 2))
是相同的
m1 = max(1, 2) m1(max'(1, 2))
同样适用于Haskell,其中(max 1 2) (max' 1 2)
相同:
m1 = max 1 2 m1 (max' 1 2)
无论如何,它可能更容易,看看我们是否删除1和2,使其prop_max1(max, max')
VS prop_max1(max(max'))
,
在第一种情况下max
,max'
它们分别是第一个和第二个参数prop_max1
,而在第二种情况下max'
是max
返回函数的参数.
这就是为什么prop_max1 (max 1 2) (max' 1 2)
有效,而prop_max1 ((max 1 2) (max' 1 2))
不是.