【问题标题】:Is this a higher kinded type in Scala?这是 Scala 中的一种高级类型吗?
【发布时间】:2012-05-09 14:01:32
【问题描述】:

有以下定义

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

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

【问题讨论】:

    标签: scala types type-kinds


    【解决方案1】:

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

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

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

    type MyMap = MyMap2[String, Int, String]
    

    “Higher-kinded”只是表示它是一种无人居住的类型,需要提供其他类型才能创建可居住的类型。

    【讨论】:

      【解决方案2】:

      不应该。

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

      如果考虑类型,有简单类型,即值的实际类型,例如IntString,甚至Int => String 和 List[Double](现在我考虑每个值,简单或不,包括函数)。然后是参数类型,也可以称为类型构造函数(称它们为类型函数会使类比更清楚)。 List(没有实例化泛型参数)并不是真正的值类型,您不能将 val 声明为类型为List,它必须是List[Something]。所以 List 可以被认为是一个给定简单类型(比如 Int)返回另一个简单类型(List[Int])的函数。据说IntStringDouble 和 Int => String 具有 kind *,而 List 具有 kind * -> *ListMap 等参数类型类似于简单函数。

      就像高阶函数是带有函数(而不是简单值)参数的函数一样,高阶类型(或有时是高阶类型)是具有类型构造函数参数的类型,而不仅仅是简单的类型参数。它有一种(* -> *) -> *,或者更复杂的东西。它们用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 中找到很多。

      【讨论】:

        猜你喜欢
        • 2011-09-08
        • 2021-08-13
        • 1970-01-01
        • 2017-09-12
        • 2015-03-08
        • 2023-03-30
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多