为什么Haskell使用箭头作为函数的类型?

CSn*_*erd 10 syntax haskell

我刚刚开始学习Haskell,其中一个奇怪的事情是具有多个参数的函数类型的语法.

考虑一个简单的例子:

(+) :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

为什么我们需要这里的所有箭头?写一些类似的东西不是更有意义Num Num Num -> Num吗?

引擎盖下的原因是什么?我搜索了这个问题,但找不到任何有用的东西.

Dav*_*vid 19

令人困惑的第一件事是Num a =>,所以我们现在完全忽略这一点.相反,我们考虑一下Int -> Int -> Int,这是您给出的类型签名的一种可能的专业化.

功能几乎都是柯里在Haskell.这意味着多参数函数实际上是一个参数的函数,它返回一个接受下一个参数的函数,依此类推.

->是正确的联想,所以Int -> Int -> Int是一样的Int -> (Int -> Int).

这也意味着这个定义

f :: Int -> Int -> Int
f x y = x + y
Run Code Online (Sandbox Code Playgroud)

是相同的

f :: Int -> Int -> Int
f x = \y -> x + y
Run Code Online (Sandbox Code Playgroud)

事实上,Haskell中的所有函数都只有一个参数.元组也存在,但它们是一等公民,因此它们不仅仅是一个参数列表.

Num a =>是类型系统的一个不同方面.它说类型变量a必须是Num类型类的实例.作为Numinclude Int和的实例的类型的常见示例Double.所以Num不是类型本身,它是一个类型类.Num a =>表示对类型变量的约束a,它不是该函数的另一个参数.

(+)方法是Num类型类的成员,因此您必须a以这种方式约束才能使用(+).如果你试图给出f签名a -> a -> a(没有约束),它将无法工作,因为它a是完全不受约束的,我们对它可以是什么类型一无所知.结果,我们无法使用(+)它.