我有一个\x f -> f x
在操作中使用的 lambda foldM
,其中x
是一个值,而f :: a -> b
.
有没有内置函数可以做到这一点?
我可以更换吗
foldM (\x f -> f x) ...
和一些f'
foldM f' ...
我以为flip
会这样做,但它需要三个参数 ( flip :: (a -> b -> c) -> b -> a -> c
)
它可能类似于|>
F#。
我有一个\x f -> f x
在操作中使用的 lambda foldM
,其中x
是一个值,而f :: a -> b
.
有没有内置函数可以做到这一点?
我可以更换吗
foldM (\x f -> f x) ...
和一些f'
foldM f' ...
我以为flip
会这样做,但它需要三个参数 ( flip :: (a -> b -> c) -> b -> a -> c
)
它可能类似于|>
F#。
您可以使用flip id
or 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 ($)
很有趣 :)
是的,它被称为flip :: (a -> b -> c) -> b -> a -> c
,例如flip (>) 3 5 == True
。有关 hackage 的更多信息和来源:翻转。
您想要的只是反转函数应用程序的参数,对吗?好吧,既然($)
是函数应用程序,通过使用翻转你可以编写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.