6

有以下定义

type MyMap = Map[String, List[Map[Int, String]]] 

Map 可以定义为更高种类的类型吗?

4

2 回答 2

9

你所拥有的不是更高种类的类型,但它可以很容易地修改为这样的类型。

type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]

现在,我们可以MyMap通过提供类型参数再次创建。

type MyMap = MyMap2[String, Int, String]

“高等类”只是意味着它是一种无人居住的类型,需要提供其他类型才能创建可居住的类型。

于 2012-05-08T13:11:35.177 回答
6

它不应该。

您可以用值和函数进行类比。您有基本值,它们不是函数,例如5"foo"。然后你就有了简单的函数,它接受简单的值作为参数并返回简单的值,例如+or length。高阶函数是具有其他函数作为参数或结果的函数。例如takeWhile,mapfoldLeft是高阶函数。

如果您考虑类型,则有简单类型,它们是值的实际类型,例如Int, String,甚至Int => String还有 List[Double] (现在我考虑每个值,无论是否简单,包括函数)。然后是参数类型,也可以称为类型构造函数(称它们为类型函数会使类比更清楚)。List(没有实例化泛型参数)并不是真正的值类型,您不能将 val 声明为 type List,它必须是List[Something]。所以 List 可以被认为是一个给定简单类型(比如 Int)返回另一个简单类型(List[Int])的函数。 Int, String, andDouble和 Int => String 被称为有kind *,而Listhas 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 中找到很多。

于 2012-05-08T13:40:50.320 回答