【发布时间】:2012-05-09 14:01:32
【问题描述】:
有以下定义
type MyMap = Map[String, List[Map[Int, String]]]
可以将 Map 定义为更高种类的类型吗?
【问题讨论】:
标签: scala types type-kinds
有以下定义
type MyMap = Map[String, List[Map[Int, String]]]
可以将 Map 定义为更高种类的类型吗?
【问题讨论】:
标签: scala types type-kinds
你所拥有的不是更高种类的类型,但它可以很容易地修改为这样的类型。
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
现在,我们可以通过提供类型参数再次创建MyMap。
type MyMap = MyMap2[String, Int, String]
“Higher-kinded”只是表示它是一种无人居住的类型,需要提供其他类型才能创建可居住的类型。
【讨论】:
不应该。
您可以用值和函数进行类比。您有基本值,它们不是函数,例如5 和"foo"。然后你有简单的函数,它接受简单的值作为参数并返回简单的值,例如+ 或length。高阶函数是具有其他函数作为参数或结果的函数。例如takeWhile、map 或foldLeft 是高阶函数。
如果考虑类型,有简单类型,即值的实际类型,例如Int、String,甚至Int => String 和 List[Double](现在我考虑每个值,简单或不,包括函数)。然后是参数类型,也可以称为类型构造函数(称它们为类型函数会使类比更清楚)。 List(没有实例化泛型参数)并不是真正的值类型,您不能将 val 声明为类型为List,它必须是List[Something]。所以 List 可以被认为是一个给定简单类型(比如 Int)返回另一个简单类型(List[Int])的函数。据说Int、String 和 Double 和 Int => String 具有 kind *,而 List 具有 kind * -> *。 List 或 Map 等参数类型类似于简单函数。
就像高阶函数是带有函数(而不是简单值)参数的函数一样,高阶类型(或有时是高阶类型)是具有类型构造函数参数的类型,而不仅仅是简单的类型参数。它有一种(* -> *) -> *,或者更复杂的东西。它们用HigherOrder[C[_]] 或HigherOrder[C[X]] 声明,以告知类型参数C 本身是参数类型或类型构造函数。请注意,这必须出现在类型声明中,而不是类型实例化中。 List 被声明为 trait List[A],所以它是参数化的,但不是更高阶的。如果你用List[Seq[Map[Int, Set[Double]]] 实例化一个,那不会使List 的订单更高。更高阶的类型将接受List(而不是List[Int])作为其参数,可以声明val x : HigherOrder[List] = ...。
高阶类型在库中并不太常见,你可以在收藏库的血腥细节中发现一些,例如GenericCompanion。你可以在 scalaz 中找到很多。
【讨论】: