有如下定义
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
和列表[双](现在我认为每一个值,简单与否,包括函数)。 再就是parameteric类型,也可称为类型构造(美其名曰输入功能将使比喻更清晰)。 名单(不instanciating泛型参数)是不是真的值的类型,你不能声明VAL是公正的类型List
,它必须是List[Something]
。 因此,名单可被视为给定一个简单的类型(比如智力)返回另一个简单的类型(列表[INT])的功能。 Int
, String
和Double
和Int =>字符串据说有一种 *
,同时List
了那种* -> *
。 参数化类型,如List
或Map
都是简单的功能类似。
正如一个高阶函数与功能(而不是简单值)参数的函数,高阶型(或有时更高kinded)是具有类构造函数的参数,而不是只是简单的类型参数的类型。 它有一种(* -> *) -> *
,或更复杂的东西。 他们宣布与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他们中的很多。
你有什么不是,kinded较高的类型,但它可以很容易地修改是这样。
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
现在,我们可以创建MyMap
通过提供类型参数一次。
type MyMap = MyMap2[String, Int, String]
“高级kinded”只是意味着它是一个类型,它是无人居住的,并且需要以创造一个可居住的类型来提供与其他类型的。