この質問は主観的ではありません。参照されている本では非常に具体的な動詞が使用されています。私は何かを誤解しているのではないかと思うので、その表現の意味が何であるかを理解したいと思います。
あなたを学びハスケル、次の段落は、「我々は仮定含む第3の最後の一つです*
」。
data Barry t k p = Barry { yabba :: p, dabba :: t k }
そして今、それをのインスタンスにしたいと思います
Functor
。Functor
種類の種類* -> *
がBarry
必要ですが、その種類があるようには見えません。どんな種類Barry
ですか?まあ、それは3つの型パラメーターを取るので、それはになるでしょうsomething -> something -> something -> *
。これp
は具体的なタイプであり、一種のを持っていると言っても安全です*
。のためにk
、我々は*
、したがって、拡張によってt
、一種のを持っていると仮定し* -> *
ます。次に、これらの種類を、something
プレースホルダーとして使用したに置き換えるだけで、種類がであることがわかり(* -> *) -> * -> * -> *
ます。
なぜ私たちは何かを仮定しているのですか?「Xを仮定する(つまり、Xがtrueであると仮定する)」と読むと、Xがfalseの場合も考慮する必要があると考えるのは自然なことです。例の具体的なケースでは、できなかったt
種類のもの(* -> *) -> *
とk
種類の(* -> *)
?これが事実であったとしてもt
、k
実際にそうであったとしても、t k
まだ具体的なタイプでしょうか?
その後、推論のすべての行がコンパイラーに対してチェックされることがわかりますが、コンパイラーが想定しているとは思いません。もしそうなら、私はそれが何であるか知りたいのですが、もしそうでなければ、私はその段落の意味を見失っていると思います。
k :: L
、あらゆる種類のためにL
限り、t :: L -> *
。ただし、ここでのコンパイラは、特定のを選択するかL
、多種多様な手段に頼らなければなりません。ポリキンドが最も一般的なオプションですが、ここではGHCが選択しますL = *
(基本的なHaskellにはポリキンドがありません。拡張機能としてオンにする必要があります)。それはかなり恣意的なものを選択するので、LYAHは「仮定」(AFAICT)という単語を使用します。