9

我有一个\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#。

4

2 回答 2

22

您可以使用flip idor 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 ($)很有趣 :)

于 2012-05-30T12:07:05.970 回答
8

是的,它被称为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.
于 2012-05-30T12:04:58.473 回答