Haskell类型签名中的括号是什么意思?

Trident D'Gao

fmapFunctor方法)的类型签名为例:

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

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

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

这两种类型签名之间甚至有区别吗?

jub0bs

是的,是有区别的,因为->类型的构造函数是右结合换一种说法,

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

相当于

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

此类型签名表示一个函数,该函数接受type的参数,a然后返回一个函数,该函数本身接受一个type的参数,b然后返回一个函数,该函数本身接受一个type的参数,f a并返回一个type的值f b

另一方面,

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

表示采用类型参数的a -> b函数(即,采用类型参数的参数a并返回类型值的b函数)并返回函数,该函数本身采用类型参数的参数f a并返回类型值的f b

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

f :: (Int -> Bool) -> [Int] -> [Bool]
f = map

g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (\n' -> (n' == n) == b)

λ> let ns = [42, 13, 42, 17]

λ> f (== 42) ns
[True,False,True,False]

λ> g 42 True ns
[True,False,True,False]

λ> g 42 False ns
[False,True,False,True]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章