我已经定义了一个函数minCurr:
minCur a = (\b -> if a > b then b else a)
询问minCur的类型时,我会得到
minCur :: Ord a => a -> a -> a
我期望的是类似的东西
minCur :: Ord a => a -> (a->a)
这是为什么?
答案 0 :(得分:2)
a -> b -> c
与a -> (b -> c)
完全相同。打印类型时,括号会被省略以提高可读性。
(a -> b) -> c
总是打印括号,否则可能会与其他类型混淆。
答案 1 :(得分:2)
在Haskell中,->
是我们所说的“正确关联”,这意味着这两件事是等效的:
foo :: a -> (b -> c)
foo :: a -> b -> c
换句话说,当编译器看到minCur :: Ord a => a -> a -> a
时,它会按预期读取minCur :: Ord a => a -> (a -> a)
。因此,您的期望是正确的,实际上没有实现。
这样做是为了提高可读性和易于编写性,因为每次需要新的论点时都要放很多括号。