我是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))
这不起作用,我得到的错误与预期类型无法匹配。为什么我不能这样写呢?
答案 0 :(得分:8)
如果您熟悉 Python , Ruby , Java 或 C# ,通常会调用函数:
func(a, b)
在 Haskell , F# 和 OCaml < / strong>他们被这样调用:
func a b
这意味着Haskell a-la a b
中的另一个术语后跟另一个术语是Python中的函数调用a-la a(b)
。
这基本上归结为:
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))
没有。
答案 1 :(得分:1)
prop_max1((max 1 2) (max' 1 2))
与:
相同prop_max1 ((max 1 2) (max' 1 2))
您可以用Python或Java等语言编写,使用()
作为函数调用,如下所示:
prop_max1(max(1, 2)(max'(1, 2)))
当您放置这样的parens时,您说要调用max 1 2
的返回值,返回值为max' 1 2
。但max 1 2
不会返回一个函数,因此不会进行类型检查。
Haskell使用空格字符表示函数调用,而parens仅用于分组表达式。 (呃,对于元组。)