は考える:私たちはこの結果を得るにはどうすればよい(b -> c, b) -> c
なぜこのHaskellコードはコンパイルされますか?
:
uncurry :: (a-> b -> c) -> (a,b) -> c
id :: a -> a
は種類の関数でuncurry id
結果を呼び出しますか?
id(a - > a)をuncurryの最初のパラメータとして使用するには、(a - > b - > c)関数が必要ですか?
は考える:私たちはこの結果を得るにはどうすればよい(b -> c, b) -> c
なぜこのHaskellコードはコンパイルされますか?
:
uncurry :: (a-> b -> c) -> (a,b) -> c
id :: a -> a
は種類の関数でuncurry id
結果を呼び出しますか?
id(a - > a)をuncurryの最初のパラメータとして使用するには、(a - > b - > c)関数が必要ですか?
我々がしようとするタイプを作るの観点からそれを見て作業する場合それは理解することは簡単です:我々はそれがuncurry
で必要とされる形状に合わせて取得するid
の型に何をする必要があるかを考え出します。我々が持っているので:
id :: a -> a
我々はまた、持っている:これはid
の元の型にa
ためb -> c
を代入して見ることができます
id :: (b -> c) -> (b -> c)
、タイプを考え出すときに代わりにInt
を代入すると同じようにid 42
です。 id
のタイプはa
がb -> c
あるフォームa -> b -> c
を、適合することを示す
id :: (b -> c) -> b -> c
:(->)
は右結合であるため、私たちは、その後、右側に括弧をドロップすることができます。言い換えれば、既に持っている一般的なタイプを特化するだけで、必要なフォームに合わせてid
のタイプを再形成することができます。
これを理解する別の方法は、uncurry ($)
もタイプ(b -> c, b) -> c
です。 id
と($)
の定義を比較:($)
は、単に、より具体的にid
の専門であることを
($) f = f
時点での事実:
id :: a -> a
id a = a
($) :: (a -> b) -> a -> b
($) f x = f x
我々は後者の定義よりポイントフリーを作ることができますタイプが明確になります。
id(a - > a)をuncurryの最初のパラメータとして使用するには、(a - > b - > c)関数が必要ですか?
実際には、uncurry
は、(a -> (b -> c))
の機能を必要とします。あなたは違いを見つけることができますか? :)
括弧を省略すると、悪い(まあ、時々)。それは、初心者がハスケルを解読することを不可能にする。もちろん、言語に関する経験を積んだら、もう必要ないような気がします。
uncurry :: (a -> (b -> c)) -> ((a,b) -> c)
id :: a -> a
を今すぐa2 -> (b -> c)
とa1 -> a1
のタイプの統一のためのuncurry id
呼び出しを書いて、:我々は戻って、明示的にすべて省略括弧を書き出したら、ここで
は、そのすべてが明らかになりました。これは簡単で、a1 ~ a2
とa1 ~ (b -> c)
です。ちょうど機械的なもの、は、創造的思考が関与していませんここに。したがって、id
は実際にはタイプa -> a where a ~ (b -> c)
であるため、a ~ (b -> c)
を(a,b) -> c
に単純に置き換えると、uncurry id
のタイプは(b -> c,b) -> c
となります。つまり、b -> c
ファンクションとb
値のペアが必要であり、値はc
でなければなりません。
タイプが最も一般的な(つまり、何もそれらについて知られていない、ので、それはいくつかの特別な方法でトリックを行う可能性があります呼び出すための具体的な機能はありません)されているので、ここでc
値を生成する唯一の方法がにありますb -> c
を呼び出し、値としてb
を引数として指定します。当然、それは($)
のことです。従ってuncurry id == uncurry ($)
が、id
が最も確かにではなく、($)
です。
'uncurry f(x、y)= f x y; id z = z; uncurry id(x、y)= id x y = x y; uncurry id = \(x、y) - > x y; uncurry id ::(a - > b、a) - > b'です。 –
ありがとうございます!それは理にかなっています!私はまだそれがスピンアウトのビットを見つける! – ssanj
@ssanj:もしそれがどんな慰めであれ、 'uncurry($)'ではなく 'uncurry id'と書くのは悪いです:) – ehird
あなたが特に悪い場合は、'(\ 'id \' 3) '($ 2)\' id \ '1 + 2(' $) 'のように'($ 3) 'の代わりに' '$' * 3'。 – Vitus