10

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

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

つまり、1つのバイナリ関数と2つの引数を取ります。

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

id :: a -> a

ただし、タイプflip idは次のとおりです。

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

単項関数であり、最初の引数に2進関数が必要な場合flipにどのように適用できますか?ididflip

ところで。flip idと類似しています\ x f -> f x

4

2 に答える 2

15

Haskellは、を設定idすることにより、最初の引数の型に適合させます。それで:flipa = b -> c

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

ここidでタイプと見なされます

id :: (b -> c) ->  b -> c

これは

id :: (b -> c) -> (b -> c)

つまり、その特殊化はid単項関数にのみ適用されます。

編集:私は私の最初の行を次のように言い換えることができると思います:
Haskellは最初の引数のタイプに適合すると推測ます。 それがより明確な場合に備えて。idflip a = b -> c

于 2009-11-11T14:23:06.730 に答える
4

Nefrubyrはそれを非常によく説明しています。
これを(うまくいけば)もう少し直感的にする別の方法は、関数適用演算子を考えることです($)

($)の特殊な形式ですid

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

(#) = flip ($)関数が適用される前に引数を記述できるように、定義を見てきましたobj # show

明らかに、($)はの特殊な形式であるため、次のidように書くこともできます。(#) = flip id

于 2009-11-11T14:35:19.263 に答える