以fmap
(Functor
方法)的类型签名为例:
(a -> b) -> f a -> f b
与以下类型签名有何不同?
a -> b -> f a -> f b
这两种类型签名之间甚至有区别吗?
是的,是有区别的,因为该->
类型的构造函数是右结合。换一种说法,
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] 删除。
我来说两句