指定参数

ten*_*kii 0 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
Run Code Online (Sandbox Code Playgroud)

我想使用这个prop_max1函数,所以我写:

prop_max1 (max 1 2) (max' 1 2)
Run Code Online (Sandbox Code Playgroud)

返回True.

但如果我写

prop_max1((max 1 2) (max' 1 2))
Run Code Online (Sandbox Code Playgroud)

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

Ele*_*fee 8

如果您熟悉Python,Ruby,JavaC#,通常会调用函数:

func(a, b)
Run Code Online (Sandbox Code Playgroud)

Haskell,F#OCaml中,它们被调用如下:

func a b
Run Code Online (Sandbox Code Playgroud)

这意味着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))
Run Code Online (Sandbox Code Playgroud)

prop_max1 ((max 1 2) (max' 1 2)) -- is the same as prop_max1(max(1, 2)(max'(1, 2))))
Run Code Online (Sandbox Code Playgroud)

请注意放置方式的不同之处prop_max1(max(1, 2), max'(1, 2))prop_max1(max(1, 2)(max'(1, 2))))不同之处().


附注:一个看起来像这样的函数调用:f(a)(b)基本上与此相同:

g = f(a)
g(b)
Run Code Online (Sandbox Code Playgroud)

但是作为单一陈述书写,意思max(1, 2)(max'(1, 2))是相同的

m1 = max(1, 2) 
m1(max'(1, 2))
Run Code Online (Sandbox Code Playgroud)

同样适用于Haskell,其中(max 1 2) (max' 1 2)相同:

m1 = max 1 2
m1 (max' 1 2)
Run Code Online (Sandbox Code Playgroud)

无论如何,它可能更容易,看看我们是否删除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))不是.