Haskell函数可以反转函数调用

时间:2012-05-30 12:03:07

标签: haskell

我有一个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#中的|>

2 个答案:

答案 0 :(得分:20)

您可以使用flip idflip ($)(因为($)只是函数的特殊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 idflip ($)的类型。这很有趣:)

答案 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.