9

操作で\x f -> f x使用されているラムダがあります。は値であり、です。foldMxf :: a -> b

これを行う組み込み関数はありますか?

交換できますか

foldM (\x f -> f x) ...

一部でf'

foldM f' ...

これでできると思ったのですflipが、引数が 3 つ必要です ( 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 fflip id探している関数でもあります。

冒険したい場合は、flip idorの型をflip ($)手動で推測してみてください。楽しいです:)

于 2012-05-30T12:07:05.970 に答える
8

はい、それはflip :: (a -> b -> c) -> b -> a -> c、例えば、と呼ばれていflip (>) 3 5 == Trueます。ハッキングに関する詳細情報とソース: flip .

あなたが望むのは、単に関数適用の引数を逆にすることですよね? まあ、($)関数適用なので、flipを使って書いてもいいですflip ($) :: b -> (b -> c) -> c。何が起こるか見てみましょう。2 つの prelude 関数のソースは次のとおりです。

-- 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 に答える