在Haskell中使用无点样式的咖喱的声明问题

时间:2014-06-13 00:13:16

标签: haskell declaration pointfree

我试图理解无点风格的概念。我创建了一个函数,尝试使用uncurry添加两个值。

add = (+) . uncurry 

结果抱怨:

No instance for (Num ((a0, b0) -> c0))
  arising from a use of `+'
Possible fix:
  add an instance declaration for (Num ((a0, b0) -> c0))
In the first argument of `(.)', namely `(+)'
In the expression: (+) . uncurry
In an equation for `add': add = (+) . uncurry

这是一个声明问题吗?我试过了add :: (Int, Int) -> Int,它也不起作用。

1 个答案:

答案 0 :(得分:5)

您应该将(+)传递给uncurry

add :: (Int, Int) -> Int
add = uncurry (+)

这是因为uncurry是一个接受二元函数并返回一元函数的函数:

uncurry :: (a -> b -> c) -> ((a, b) -> c)

你的二进制函数是(+),需要两个Num s并将它们相加。因此,uncurry (+)会将(+)转换为:

(Num, Num) -> Num

然后由add类型签名限制为:

(Int, Int) -> Int