次の定義を持つ
type MyMap = Map[String, List[Map[Int, String]]]
マップは、より高い種類のタイプとして定義できますか?
次の定義を持つ
type MyMap = Map[String, List[Map[Int, String]]]
マップは、より高い種類のタイプとして定義できますか?
あなたが持っているのは、より親切なタイプではありませんが、そのように非常に簡単に変更することができます。
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
MyMap
これで、型パラメーターを指定して再度作成できます。
type MyMap = MyMap2[String, Int, String]
「高種類」とは、無人のタイプであり、居住可能なタイプを作成するために他のタイプを提供する必要があることを意味します。
すべきではありません。
値と関数で類推することができます。やなどの関数ではない基本的な値があり5
ます"foo"
。次に、単純な関数があります。これは、引数として単純な値を取り、+
またはなどの単純な値を返しますlength
。高階関数は、パラメーターまたは結果として他の関数を持つ関数です。たとえば、、、takeWhile
またははmap
高階foldLeft
関数です。
タイプを検討する場合、単純なタイプがあります。これは、、、または偶数などの実際の値のタイプでありInt
、String
List Int => String
[Double]です(関数を含む、単純かどうかに関係なく、すべての値を検討します)。次に、型コンストラクターと呼ばれることもあるパラメーター型があります(それらを型関数と呼ぶと、類推がより明確になります)。リスト(ジェネリックパラメーターをインスタンス化せずに)は実際には値の型ではありません。valを型だけであると宣言することはできません。List
そうである必要がありますList[Something]
。したがって、Listは、単純な型(Intなど)を指定すると別の単純な型(List [Int])を返す関数と見なすことができます。 Int
、、、String
およびDouble
Int =>文字列は種類があると言われますが、種類 *
はありList
ます* -> *
。などのパラメトリックタイプList
またはMap
、単純な関数に類似しています。
高階関数が(単純な値ではなく)関数パラメーターを持つ関数であるのと同様に、高階型(または場合によっては高階型)は、単純な型パラメーターではなく、型コンストラクターパラメーターを持つ型です。それは種類(* -> *) -> *
、またはより複雑なものを持っています。これらは、、HigherOrder[C[_]]
またはHigherOrder[C[X]]
で宣言され、型パラメーターC
、、自体がパラメトリック型、または型コンストラクターであることを示します。これは、型のインスタンス化ではなく、型宣言に表示される必要があることに注意してください。List
はトレイトとして宣言されList[A]
ているため、パラメトリックですが、高次ではありません。でインスタンス化した場合、の順序はそれ以上高くList[Seq[Map[Int, Set[Double]]]
なりません。List
高次の型は、パラメーターとしてList
(ではなくList[Int]
)を受け入れるので、を宣言できval x : HigherOrder[List] = ...
ます。
高次のタイプはライブラリではあまり一般的ではありません。GenericCompanionなどのコレクションライブラリの厄介な詳細でいくつか見つけることができます。あなたはそれらの多くをscalazで見つけることができます。