2017-09-27 10 views
2

種類レベルのかっこはどういう意味ですか?私は以下の種類を理解して

String :: * 
[] :: * -> * 
(->) :: * -> * -> * 
(,) :: * -> * -> * 

しかし、この種は何を意味し、それがどのようなタイプを表すのでしょうか?

? :: (* -> *) -> * 
+2

ここでは不自然な例です。次に、IC [1,2,3]やIC(Data.Set.List [1,2,3])のような値を持つことができます。 'IntContainer ::(* - > *) - > *'に注意してください。 – Alec

+0

最初の型パラメータとして、より高級な型を渡したとします。 –

+2

@WillemVanOnsem: '* - > *'は、より上位の型ではありません。 '(* - > *) - > *'は高次関数がパラメータとして関数を取るように、上位型は型コンストラクタをパラメータとして取ります。 –

答えて

3

? :: (* -> *) -> *あなたは親切* -> *?何かに与えれば、あなたがタイプ(種類*の何かを)取り戻すだろうことを意味します。具体的な例を取ってみましょう:Intを含むことを意味します。私は、基礎となるデータ構造としてリスト、セット、または私が欲しいもの(のようなもの* -> *)でIntContainer Sを作ることができます。ただし、fはタイプではありません。タイプになる前に別のタイプを適用する必要があります。それで:IntContainerに何かが適用される必要があります。それには、それに適用されるタイプが必要です。

ghci> :kind IntContainer 
IntContainer :: (* -> *) -> * 

私はIntContainerに優しい* -> *のものを適用することにより、具体的な種類を作ることができます: `データIntContainerのF = IC(F INT)`:

ghci> ic1 = IC [1,2,3] 
ic1 :: IntContainer []       -- [] :: * -> * 
ghci> ic2 = IC (Data.Set.fromList [1,2,3]) 
ic2 :: IntContainer Set       -- Set :: * -> * 
ghci> ic3 = IC (Data.Sequence.fromList [1,2,3]) 
ic3 :: IntContainer Seq       -- Seq :: * -> * 
+0

タイプコンストラクタをパラメータとして持つ親和性の高い型。今私には明らかです。私の防衛では、 '(* - > *) - > * 'のような種類の注釈は、抽象度がかなり高いとしか言​​えません。ありがとうございました! – ftor

関連する問題