49

式に興味がありますflip id(宿題ではありませんgetOpt。ドキュメントで見つけました)。

なぜこのタイプがあるのだろうか:

Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c

たとえば、(flip id) 5 (+6)を与え11ます。

なぜid (+6) 511 が得られるかはわかっていますが、そのことを「理解」していませんflip id

私はペンと紙を使って自分でこれを理解しようとしましたが、できませんでした。誰か私にこれを説明してもらえますか? つまり、どのflip idようにして型を持つようになるのb -> (b -> c) -> cでしょうか?

4

1 に答える 1

78

id関数のタイプは次のとおりです。

id :: a -> a

次のように置き換えると、このタイプのインスタンスを取得しaますa -> b

id :: (a -> b) -> (a -> b)

これは、カリー化のため、次と同じです。

id :: (a -> b) -> a -> b

これに適用flipすると、次のようになります。

flip id :: a -> (a -> b) -> b

id (+)インスタンスの場合は次のとおりです。

id :: (Num a) => (a -> a) -> (a -> a)

flip idあなたに与える:

flip id :: (Num a) => a -> (a -> a) -> a

補足:これは、より制限されたタイプで、($)と同じである方法も示しています。id

($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f   = f
-- hence:
($)     = id
于 2012-09-09T14:22:49.350 に答える