为什么Haskell中的flip和flip(:)功能不同?

时间:2018-08-03 09:45:08

标签: haskell

Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t flip(:)
flip(:) :: [a] -> a -> [a]

我不认为(:)flip的特殊语法糖。那么对flip做了什么?

2 个答案:

答案 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 ~ da是同一类型),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