以fmap
的类型签名(Functor
方法)为例:
(a -> b) -> f a -> f b
与以下类型签名有何不同?
a -> b -> f a -> f b
这两种类型签名之间是否存在差异?
答案 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 -> ...
表示两个参数。