gpt4 book ai didi

scala - Scala 中的高级类型是什么?

转载 作者:行者123 更新时间:2023-12-02 16:40:40 24 4
gpt4 key购买 nike

您可以在网络上找到以下内容:

  • 高级类型 == 类型构造函数?

    class AClass[T]{...} // For example, class List[T]


    有人说这是一种更高级的类型,因为它
    对符合定义的类型进行抽象。

    Higher kinded types are types which take other types and construct a new type



    这些虽然也称为类型构造函数。 (例如,在 Programming in Scala 中)。
  • 将类型构造函数作为类型参数的高级类型 == 类型构造函数?

    文中Generics of a Higher Kind ,你可以阅读

    ... types that abstract over types that abstract over types ('higher-kinded types') ..."



    这表明

    class XClass[M[T]]{...} // or

    trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]]


    是一种更高级的类型。

  • 因此,考虑到这一点,很难区分类型构造函数、高级类型和以类型构造函数作为类型参数的类型构造函数,因此上述问题。

    最佳答案

    让我通过消除歧义来弥补开始的一些困惑。我喜欢用值(value)水平来类比来解释这一点,因为人们往往更熟悉它。

    A type constructor is a type that you can apply to type arguments to "construct" a type.

    A value constructor is a value that you can apply to value arguments to "construct" a value.


    值构造函数通常称为“函数”或“方法”。这些“构造函数”也被称为“多态的”(因为它们可用于构造不同“形状”的“东西”)或“抽象”(因为它们抽象了不同多态实例之间的差异)。
    在抽象/多态的上下文中,一阶是指抽象的“一次性使用”:您对一个类型进行一次抽象,但该类型本身不能对任何内容进行抽象。 Java 5 泛型是一阶的。
    上述抽象特征的一阶解释是:

    A type constructor is a type that you can apply to proper type arguments to "construct" a proper type.

    A value constructor is a value that you can apply to proper value arguments to "construct" a proper value.


    为了强调不涉及抽象(我想你可以称之为“零阶”,但我没有看到在任何地方使用过),例如值 1或类型 String ,我们通常说某物是“正确的”值或类型。
    一个适当的值是“立即可用的”,因为它不等待参数(它不会抽象它们)。将它们视为可以轻松打印/检查的值(序列化函数是作弊!)。
    正确类型是对值进行分类的类型(包括值构造函数),类型构造函数不对任何值进行分类(它们首先需要应用于正确的类型参数以产生正确的类型)。要实例化一个类型,它是一个适当的类型是必要的(但不是充分的)。 (它可能是抽象类,也可能是您无权访问的类。)
    “高阶”只是一个通用术语,表示重复使用多态性/抽象。对于多态类型和值,这意味着同样的事情。具体来说,高阶抽象抽象了抽象事物。对于类型,术语“higher-kinded”是更通用的“higher-order”的特殊用途版本。
    因此,我们表征的高阶版本变为:

    A type constructor is a type that you can apply to type arguments (proper types or type constructors) to "construct" a proper type (constructor).

    A value constructor is a value that you can apply to value arguments (proper values or value constructors) to "construct" a proper value (constructor).


    因此,“高阶”仅意味着当您说“对 X 进行抽象”时,您是认真的! X抽象出来的东西并没有失去它自己的“抽象权”:它可以抽象它想要的一切。 (顺便说一句,我在这里使用动词“抽象”的意思是:省略对值或类型的定义不是必需的东西,以便抽象的用户可以将其作为参数进行更改/提供.)
    以下是一些正确、一阶和高阶值和类型的示例(受 Lutz 通过电子邮件提出的问题的启发):
                       proper    first-order           higher-order

    values 10 (x: Int) => x (f: (Int => Int)) => f(10)
    types (classes) String List Functor
    types String ({type λ[x] = x})#λ ({type λ[F[x]] = F[String]})#λ
    其中使用的类定义为:
    class String
    class List[T]
    class Functor[F[_]]
    为了避免通过定义类的间接性,您需要以某种方式表达匿名类型函数,这些函数在 Scala 中无法直接表达,但是您可以使用结构类型而不会产生太多语法开销( -style 是由于 https://stackoverflow.com/users/160378/retronym afaik ):
    在支持匿名类型函数的某些假设的 Scala future 版本中,您可以将示例中的最后一行缩短为:
    types (informally) String    [x] => x              [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be
    (就个人而言,我很遗憾曾经谈论过“高级类型”,它们毕竟只是类型!当您绝对需要消除歧义时,我建议说诸如“类型构造函数参数”、“类型构造函数成员”之类的东西,或“类型构造函数别名”,以强调您不是在谈论正确的类型。)
    ps:更复杂的是,“多态”以不同的方式含糊不清,因为多态类型有时意味着通用量化类型,例如 Forall T, T => T ,这是一个适当的类型,因为它对多态值进行分类(在 Scala 中,这个值可以写成结构类型 {def apply[T](x: T): T = x} )

    关于scala - Scala 中的高级类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246719/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com