Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t flip(:)
flip(:) :: [a] -> a -> [a]
我不认为(:)
是flip
的特殊语法糖。那么对flip
做了什么?
答案 0 :(得分:4)
“成分”是:
flip :: (a -> (b -> c)) -> (b -> (a -> c))
(:) :: d -> ([d] -> [d])
因此,这里flip
可以接受一个函数(类型为a -> b -> c
),并且基本上将其转换为类型为b -> a -> c
的函数,因此这里的“参数”(从技术上讲Haskell函数具有恰好一个参数)被“翻转”。
如果您编写flip (:)
,则会翻转(:)
函数。由于(:)
函数的类型为d -> [d] -> [d]
,因此结果为[d] -> d -> [d]
。
但是我们可以执行更严格的类型推断。由于(:)
是带有flip
的函数应用程序的参数,因此我们知道(:)
的类型应与{的 parameter 的类型相同{1}},因此:
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 (:)
和一个元素xs
,然后将一个元素被前缀的列表返回给定列表(所以{ {1}}。
答案 1 :(得分:3)
flip (:)
是flip
和(:)
的应用程序。
它们的类型是
Prelude> :t flip
flip :: (a -> b -> c ) -> ( b -> a -> c )
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t flip (:)
flip (:) :: [a] -> a -> [a]
flip
只是将两个参数切换为一个函数:
flip f y x = f x y
因此
flip (:) xs x = (:) x xs = x : xs