有以下定义
type MyMap = Map[String, List[Map[Int, String]]]
Map 可以定义为更高种类的类型吗?
你所拥有的不是更高种类的类型,但它可以很容易地修改为这样的类型。
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
现在,我们可以MyMap
通过提供类型参数再次创建。
type MyMap = MyMap2[String, Int, String]
“高等类”只是意味着它是一种无人居住的类型,需要提供其他类型才能创建可居住的类型。
它不应该。
您可以用值和函数进行类比。您有基本值,它们不是函数,例如5
和"foo"
。然后你就有了简单的函数,它接受简单的值作为参数并返回简单的值,例如+
or length
。高阶函数是具有其他函数作为参数或结果的函数。例如takeWhile
,map
或foldLeft
是高阶函数。
如果您考虑类型,则有简单类型,它们是值的实际类型,例如Int
, String
,甚至Int => String
还有 List[Double] (现在我考虑每个值,无论是否简单,包括函数)。然后是参数类型,也可以称为类型构造函数(称它们为类型函数会使类比更清楚)。List(没有实例化泛型参数)并不是真正的值类型,您不能将 val 声明为 type List
,它必须是List[Something]
。所以 List 可以被认为是一个给定简单类型(比如 Int)返回另一个简单类型(List[Int])的函数。 Int
, String
, andDouble
和 Int => String 被称为有kind *
,而List
has kind * -> *
。参数类型,例如List
或者Map
类似于简单的函数。
正如高阶函数是带有函数(而不是简单值)参数的函数一样,高阶类型(或有时是高阶类型)是具有类型构造函数参数的类型,而不仅仅是简单的类型参数。它有 kind(* -> *) -> *
或更复杂的东西。它们用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 中找到很多。