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

Fiz*_*zzz 2 haskell declaration pointfree

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

add = (+) . uncurry 
Run Code Online (Sandbox Code Playgroud)

并且结果抱怨:

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
Run Code Online (Sandbox Code Playgroud)

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

Sho*_*hoe 5

你应该(+)转到uncurry:

add :: (Int, Int) -> Int
add = uncurry (+)
Run Code Online (Sandbox Code Playgroud)

这是因为uncurry是一个带二进制函数并返回一元函数的函数:

uncurry :: (a -> b -> c) -> ((a, b) -> c)
Run Code Online (Sandbox Code Playgroud)

您的二进制函数(+)需要两个Nums并将它们相加.因此uncurry (+)将转变(+)为:

(Num, Num) -> Num
Run Code Online (Sandbox Code Playgroud)

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

(Int, Int) -> Int
Run Code Online (Sandbox Code Playgroud)