種類を推定するときに「Learn You a Haskell」で行われた仮定は何ですか?


18

この質問は主観的ではありません。参照されている本では非常に具体的な動詞が使用されています。私は何かを誤解しているのではないかと思うので、その表現の意味が何であるかを理解したいと思います。

あなたを学びハスケル、次の段落は、「我々は仮定含む第3の最後の一つです*」。

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

そして今、それをのインスタンスにしたいと思いますFunctorFunctor種類の種類* -> *Barry必要ですが、その種類があるようには見えません。どんな種類Barryですか?まあ、それは3つの型パラメーターを取るので、それはになるでしょうsomething -> something -> something -> *。これpは具体的なタイプであり、一種のを持っていると言っても安全です*のためにk、我々は*、したがって、拡張によってt、一種のを持っていると仮定し* -> *ます。次に、これらの種類を、somethingプレースホルダーとして使用したに置き換えるだけで、種類がであることがわかり(* -> *) -> * -> * -> *ます。

なぜ私たちは何かを仮定しているのですか?「Xを仮定する(つまり、Xがtrueであると仮定する)」と読むと、Xがfalseの場合も考慮する必要があると考えるのは自然なことです。例の具体的なケースでは、できなかったt種類のもの(* -> *) -> *k種類の(* -> *)?これが事実であったとしてもtk実際にそうであったとしても、t kまだ具体的なタイプでしょうか?

その後、推論のすべての行がコンパイラーに対してチェックされることがわかりますが、コンパイラーが想定しているとは思いません。もしそうなら、私はそれが何であるか知りたいのですが、もしそうでなければ、私はその段落の意味を見失っていると思います。


4
あなたは正しいです。確かに、我々は持つことができk :: L、あらゆる種類のためにL限り、t :: L -> *。ただし、ここでのコンパイラは、特定のを選択するかL、多種多様な手段に頼らなければなりません。ポリキンドが最も一般的なオプションですが、ここではGHCが選択しますL = *(基本的なHaskellにはポリキンドがありません。拡張機能としてオンにする必要があります)。それはかなり恣意的なものを選択するので、LYAHは「仮定」(AFAICT)という単語を使用します。
チー

1
おそらく、コンパイラが私を戸惑わせたのは、少なくとも私たちが思っているよりも少ないか、まったく理解していないと思います。
エンリコマリアデアンジェリス

回答:


19

実際、コンパイラは仮定します!ただし、PolyKinds拡張機能を使用しないように要求できます。詳細については、こちらをご覧ください。その拡張機能がオンになっていると、種類はにBarryなりますforall k. (k -> *) -> k -> * -> *


-1

いい視点ね。著者は不必要な推測をしています。おそらく、彼のType Fooの章で理解しやすくするためだけかもしれませんが、あなたのような人は当然これに疑問を投げかけるかもしれません。

どちらも tkおよびp型変数です。見てわかるように、yabba :: pそれは単独で存在できるので、定数関数のようであり、まるで型ではなく値であるかのように、型シグネチャはIntor と言うでしょCharう...名前を付けます。しかし、それは型なので、親切な署名は*です。

しかし、tここに入力すると、型変数をとるk(タイプを構築するためにdabba :: t k我々が確認します(ここではありませんassumtion)ということであるので、t同じような種類の署名を持っている* -> *k持っています*

私たちはこのことを知ったら...タイプBarry t k pの一種署名があり(* -> *) -> * -> * -> *、それが取る意味しt、その後k、その後p、私たちは与えてBarry入力します。

編集以下の@luquiのコメントを必ずお読みください。


7
k*あなたが推論している間あなたが主張するとおりであるように制約されていませんt。たとえば、k :: * -> *およびを使用できますt :: (* -> *) -> *doo :: k Intレコードにフィールドを追加すると、問題なく通過します。
ルキ

@luqui ..はい、そうです...あなたのコメントは本当に価値があるので、この回答は削除しません。
Redu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.