操作で\x f -> f x
使用されているラムダがあります。は値であり、です。foldM
x
f :: a -> b
これを行う組み込み関数はありますか?
交換できますか
foldM (\x f -> f x) ...
一部でf'
foldM f' ...
これでできると思ったのですflip
が、引数が 3 つ必要です ( flip :: (a -> b -> c) -> b -> a -> c
)
おそらく|>
F# と似ています。
操作で\x f -> f x
使用されているラムダがあります。は値であり、です。foldM
x
f :: a -> b
これを行う組み込み関数はありますか?
交換できますか
foldM (\x f -> f x) ...
一部でf'
foldM f' ...
これでできると思ったのですflip
が、引数が 3 つ必要です ( 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
orの型をflip ($)
手動で推測してみてください。楽しいです:)
はい、それは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.