Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t flip(:)
flip(:) :: [a] -> a -> [a]
我不认为(:)
是一个特殊的语法糖flip
。那么它做了flip
什么?
“成分”是:
flip :: (a -> (b -> c)) -> (b -> (a -> c))
(:) :: d -> ([d] -> [d])
所以这里flip
可以采用一个函数( type a -> b -> c
),它基本上将它转换为 type 的函数b -> a -> c
,因此“参数”(从技术上讲,在 Haskell 中,函数只有一个参数)被“翻转”。
如果你写flip (:)
,你就翻转了(:)
函数。由于该(:)
函数具有类型d -> [d] -> [d]
,因此结果为[d] -> d -> [d]
。
然而,我们可以执行更严格的类型推断。既然(:)
是一个功能应用的参数flip
,我们知道的类型(:)
应该是相同的类型参数的flip
,所以:
a -> ( b -> c )
~ d -> ([d] -> [d])
-----------------------
a ~ d, b ~ [d], c ~ [d]
所以我们得出结论a ~ d
(a
和d
是相同的类型),b ~ c ~ [d]
。因此,这意味着类型flip (:)
是:
flip (:) :: b -> a -> c
或者当我们对更具体的类型执行替换时:
flip (:) :: [d] -> d -> [d]
在语义上flip (:)
接受一个 listxs
和一个 element x
,并返回一个列表,其中元素被添加到给定的列表(so (x:xs)
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句