Luk*_*asz 6 types scala type-kinds
有以下定义
type MyMap = Map[String, List[Map[Int, String]]]
Run Code Online (Sandbox Code Playgroud)
Map可以定义为更高的kinded类型吗?
你所拥有的不是一种更高级的类型,但它可以很容易地修改为这样.
type MyMap2[A,B,C] = Map[A, List[Map[B, C]]]
Run Code Online (Sandbox Code Playgroud)
现在,我们可以MyMap通过提供类型参数再次创建.
type MyMap = MyMap2[String, Int, String]
Run Code Online (Sandbox Code Playgroud)
"高级"只是意味着它是一种无人居住的类型,需要提供其他类型才能创造一种可居住的类型.
它不应该.
您可以对值和函数进行类比.您有基本值,这些不是函数,例如5和"foo".然后你有简单的函数,它将简单的值作为参数并返回简单的值,例如+或length.高阶函数是具有其他函数作为参数或结果的函数.例如takeWhile,map或者foldLeft是更高阶的函数.
如果你考虑的类型,也有简单的类型,这是实际值的类型,例如Int,String或者甚至Int => String和List [双](现在我认为每一个值,简单与否,包括函数).然后有参数类型,也可以称为类型构造函数(调用它们类型函数会使类比更清晰).List(没有实例化泛型参数)实际上并不是值的类型,你不能声明val只是类型List,它必须是List[Something].所以List可以被认为是一个函数,给定一个简单类型(比如Int)返回另一个简单类型(List [Int]). Int,String和,Double和Int => String据说有种类 *,而且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中找到很多这些.
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |