参数

时间:2016-01-11 17:25:05

标签: haskell

我是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))

这不起作用,我得到的错误与预期类型无法匹配。为什么我不能这样写呢?

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'))

在第一种情况下,maxmax'分别是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仅用于分组表达式。 (呃,对于元组。)