type MyMap = Map[String, List[Map[Int, String]]]
が高いkindedタイプとして定義されてマッピングすることができ、次のように定義あるだろうか?
type MyMap = Map[String, List[Map[Int, String]]]
が高いkindedタイプとして定義されてマッピングすることができ、次のように定義あるだろうか?
そうしてはいけません。
値と機能に類推することができます。基本値は5
や"foo"
などの関数ではありません。単純な関数を引数として取り、簡単な値を返します(+
やlength
など)。高次関数は、他の関数をパラメータまたは結果として持つ関数です。例えば、takeWhile
,map
またはfoldLeft
は高次関数である。
あなたは値の実際の型でシンプルなタイプ、などInt
、String
があり、種類を検討し、あるいはInt => String
とした場合一覧[ダブル](今私は関数を含む、単純またはなく、すべての値を、考えます) 。次に、タイプコンストラクタと呼ばれることもあるパラメータ型があります(型関数を呼び出すと、類推がより明確になります)。リストは(genericパラメータをインスタンス化せずに)実際には値の型ではなく、valの型をちょうどList
と宣言することはできません。List[Something]
でなければなりません。したがって、Listは、単純な型(Int)が別の単純な型(List [Int])を返す関数として考えることができます。 Int
,String
およびDouble
およびInt => Stringは、種類*
と言い、List
は種類* -> *
です。 List
またはMap
などのパラメトリックタイプは、単純な関数と類似しています。
高次関数は(単純値の代わりに)関数を持つ関数と同様に、単純型パラメータではなく、型コンストラクタパラメータを持つ型です。それは種類(* -> *) -> *
、または何かより複雑です。タイプパラメータC
はそれ自体がパラメトリックタイプまたはタイプコンストラクタであることを伝えるために、HigherOrder[C[_]]
またはHigherOrder[C[X]]
と宣言されています。これは型の宣言ではなく、型のインスタンス化でなければならないことに注意してください。 List
は、形質List[A]
と宣言されているため、パラメトリックですが高次ではありません。 List[Seq[Map[Int, Set[Double]]]
でインスタンス化すると、List
のオーダーはそれ以上高くなりません。高次型は、(List[Int]
ではなく)をパラメータとして受け取り、val x : HigherOrder[List] = ...
と宣言することができます。
高次タイプはライブラリではあまり一般的ではありませんが、コレクションライブラリの詳細については、GenericCompanionなどをご紹介ください。あなたはscalazでそれらの多くを見つけることができます。
あなたが持っているものは、より高潔なタイプではありませんが、それはかなり簡単に変更することができます。
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
タイプパラメータを指定することで、MyMap
を再度作成できます。
type MyMap = MyMap2[String, Int, String]
「高-kindedは」ちょうどそれが無人であるタイプであることを意味し、居住タイプを作成するために、他の種類を設ける必要があります。