2012-01-20 10 views
16

は考える:私たちはこの結果を得るにはどうすればよい(b -> c, b) -> cなぜこのHaskellコードはコンパイルされますか?

uncurry :: (a-> b -> c) -> (a,b) -> c  
id :: a -> a 

は種類の関数でuncurry id結果を呼び出しますか?

id(a - > a)をuncurryの最初のパラメータとして使用するには、(a - > b - > c)関数が必要ですか?

答えて

25

我々がしようとするタイプを作るの観点からそれを見て作業する場合それは理解することは簡単です:我々はそれがuncurryで必要とされる形状に合わせて取得するidの型に何をする必要があるかを考え出します。我々が持っているので:

id :: a -> a 

我々はまた、持っている:これはidの元の型にaためb -> cを代入して見ることができます

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

、タイプを考え出すときに代わりにIntを代入すると同じようにid 42です。 idのタイプはab -> 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 

我々は後者の定義よりポイントフリーを作ることができますタイプが明確になります。

+2

ありがとうございます!それは理にかなっています!私はまだそれがスピンアウトのビットを見つける! – ssanj

+1

@ssanj:もしそれがどんな慰めであれ、 'uncurry($)'ではなく 'uncurry id'と書くのは悪いです:) – ehird

+1

あなたが特に悪い場合は、'(\ 'id \' 3) '($ 2)\' id \ '1 + 2(' $) 'のように'($ 3) 'の代わりに' '$' * 3'。 – Vitus

8

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 ~ a2a1 ~ (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が最も確かにではなく、($)です。

+0

'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'です。 –