Haskell类型签名中括号的含义是什么?

时间:2015-12-07 15:12:13

标签: haskell types parentheses

fmap的类型签名(Functor方法)为例:

(a -> b) -> f a -> f b

与以下类型签名有何不同?

a -> b -> f a -> f b

这两种类型签名之间是否存在差异?

3 个答案:

答案 0 :(得分:31)

是的,有区别,因为the -> type constructor is right-associative。换句话说,

a -> b -> f a -> f b

相当于

a -> (b -> (f a -> f b))

此类型签名表示一个函数,它接受类型为a的参数并返回一个函数,该函数本身采用类型为b的参数并返回一个函数,该函数本身采用类型为{的参数{1}}并返回f a类型的值。

另一方面,

f b

表示一个函数,它接受类型为(a -> b) -> f a -> f b 的参数(即采用类型a -> b的参数并返回类型a的值的函数)并返回一个函数,该函数本身采用b类型的参数,并返回类型为f a的值。

这是一个人为的例子,说明了两种类型签名之间的区别:

f b

答案 1 :(得分:13)

是,

(a -> b) -> ...

表示"给出一个带a到b ..."的函数。虽然,这个

a -> b -> ...

表示"给出一些和一些b ..."

答案 2 :(得分:6)

是的,(a -> b)表示一个参数是签名为a -> b的函数,而a -> b -> ...表示两个参数。