我有一个lambda \x f -> f x
,用于foldM
操作,其中x
是一个值f :: a -> b
。
是否有内置函数可以执行此操作?
我可以替换
foldM (\x f -> f x) ...
有一些f'
foldM f' ...
我认为flip
会这样做,但需要三个参数(flip :: (a -> b -> c) -> b -> a -> c
)
它可能类似于F#中的|>
。
答案 0 :(得分:20)
您可以使用flip id
或flip ($)
(因为($)
只是函数的特殊id
):
Prelude> flip id 3 (+2)
5
Prelude> flip ($) 7 (>10)
False
这是部分应用程序的一个有趣用途:id f x
f
是一个函数只是f x
。显然,这也与(flip id) x f
相同,因此flip id
是您正在寻找的功能。
如果您有冒险精神,请尝试手动推断flip id
或flip ($)
的类型。这很有趣:)
答案 1 :(得分:8)
是的,它被称为flip :: (a -> b -> c) -> b -> a -> c
,例如flip (>) 3 5 == True
。有关hackage的更多信息和来源:flip。
你想要的只是反转函数应用程序的参数,对吧?
好吧,由于($)
是函数应用程序,因此使用flip可以编写flip ($) :: b -> (b -> c) -> c
。让我们看看会发生什么以下是两个前奏函数的来源:
-- from Hackage:
($) :: (a -> b) -> a -> b
f $ x = f x
-- from Hackage:
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
所以,基本上如果你把类型放在一起,flip ($)
变成
flip ($) ::
b -> -- type of x, argument of y and second argument of ($)
(b -> c) -> -- type of y, function applied by ($) as its first argument
c -> -- result of the application "y x"
如果您遵循功能的实际定义:
flip ($) = (\f x y -> f y x) ($) -- from flip's def.
= \x y -> ($) y x -- partial application
= y x -- from ($)'s def.