[英]Why are flip and flip(:) different functions in Haskell?
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
可以采用一个函数(类型a -> b -> c
),并且基本上将其转换为类型为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 (:)
接受一个列表xs
和一个元素x
,并返回一个列表,其中该元素位于该列表的前面 (so (x:xs)
)。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.