什么是斯卡拉更高的kindedtypes?

您可以在网上find以下内容:

  1. 较高的亲属types==types的构造函数?

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

    有人说这是一个更高级的types,因为它抽象了符合定义的types。

    更高的亲属types是其他types的types,并构build一个新的types

    这些虽然也被称为types构造函数 。 (例如, 在Scala中编程 )。

  2. 更高的kindedtypes==types构造函数,它将types构造函数作为types参数?

    在更高类的generics中 ,您可以阅读

    …抽象types的抽象types('高级types')…“

    这表明这一点

     class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // eg trait Functor[F[_]] 

    是一个更高的kindedtypes。

因此,考虑到这一点,很难区分types构造函数更高版本typestypes构造函数作为types参数的types构造函数 ,因此上述问题。

让我通过一些消除歧义的方式来弥补这个混乱。 我喜欢用价值层面的类比来解释这一点,因为人们往往更熟悉它。

types构造函数是一种types,可以应用于input参数来“构造”一个​​types。

值构造函数是一个值,您可以将其应用于值参数以“构造”一个​​值。

价值构造函数通常被称为“函数”或“方法”。 这些“构造函数”也被认为是“多态的”(因为它们可以用来构造不同“形状”或“抽象”的东西(因为它们抽象了不同的多态实例之间的变化)。

在抽象/多态性的背景下,一阶是指抽象的“单一使用”:你抽象一次types,但是这种types本身不能抽象任何东西。 Java 5generics是一阶的。

对上述抽象特征的一阶解释是:

types构造函数是一种types,您可以将其应用于正确的types参数以“构造”适当的types。

值构造函数是一个值,您可以将其应用于适当的值参数来“构造”一个​​适当的值。

为了强调没有涉及的抽象(我猜你可以称之为“零阶”,但是我没有看到这个在任何地方使用过),比如值1Stringtypes,我们通常会说某些东西是“合适的”值,或者types。

一个适当的价值是“立即可用的”,因为它不等待争论(它不会抽象)。 把它们想象成你可以轻松打印/检查的值(序列化函数是作弊的!)。

一个合适的types是对值进行分类的types(包括值构造函数),types构造函数不对任何值进行分类(它们首先需要应用到正确的types参数以产生适当的types)。 要实例化一个types,它是必要的(但不是充分的),它是一个适当的types。 (这可能是一个抽象类,或者你无法访问的类。)

“高阶”只是一个通用术语,意思是重复使用多态/抽象。 对于多态types和值来说,它意味着同样的事情。 具体而言,高阶抽象抽象概括抽象某事的东西。 对于types而言,“更高级”这个术语是更一般的“更高级”的特殊用途版本。

因此,我们表征的高阶版本变成:

types构造函数是一种types,您可以应用于types参数(适当的types或types构造函数)来“构造”适当的types(构造函数)。

值构造函数是一个值,您可以将其应用于值参数(适当的值或值构造函数)来“构造”适当的值(构造函数)。

因此,“高阶”就是说当你说“X抽象”时,你真的是这个意思! 被抽象的X不会失去自己的“抽象权”:它可以抽象所有想要的东西。 (顺便说一句,我在这里使用动词“抽象”来表示:为了定义一个值或一个types而省略一些不重要的东西,以便抽象的用户可以作为一个参数来改变/提供。)

以下是一些适当的,一阶和更高阶值和types的例子(受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[_]] 

为了避免通过定义类的间接性,需要以某种方式expression匿名types函数,这些函数不能直接在Scala中表示,但是可以使用结构types,而没有太多的语法开销( 样式是由于https:// stackoverflow .com / users / 160378 / retronym afaik):

在一些支持匿名types函数的Scala未来的Scala版本中,可以将示例中的最后一行缩短为:

 types (informally) String [x] => x [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be 

(从个人的angular度来说,我曾经讨论过“高级types”,毕竟他们只是types!当你绝对需要消除歧义的时候,我build议你说一下“types构造函数参数”,“types构造函数成员” ,或“types构造器别名”,以强调你不是在谈论正确的types。)

ps:使事情进一步复杂化,“多态”是不同的方式,因为多态types有时意味着普遍量化的types,如Forall T, T => T ,这是一个适当的types,因为它分类多态性值在Scala中,这个值可以写成结构types{def apply[T](x: T): T = x}

(这个答案是试图装饰阿德里亚摩尔答案的一些graphics和历史信息。)

自2.5以来,更高级别的types是Scala的一部分。

  • 在那之前,作为Java到现在为止,Scala不允许使用types构造函数(Java中的“generics”)作为types构造函数的types参数。 例如

      trait Monad [M[_]] 

    是不可能的。

    在Scala 2.5中,types系统已经被扩展为在更高层次上对types进行分类(称为types构造函数多态 )。 这些分类被称为种类。

    类型和类型的实现,**从“更高类型的泛型” (图片来源于更高types的generics )

    结果就是,types构造函数(例如List )可以像types构造函数的types参数位置中的其他types一样使用,所以它们自从Scala 2.5以来就成为了第一类types。 (类似于Scala中头等值的函数)。

    在支持更高types的types系统的上下文中,我们可以从List等一级types和类似于FunctorMonad 的更高types (对抽象types抽象的types)区分合适的types ,如IntList[Int]以上types)。

    另一方面Java的types系统不支持种类,因此没有“更高types”的types。

    所以这个必须在配套型体系的背景下看到。

  • 在Scala的情况下,你经常会看到类似构造函数的例子

      trait Iterable[A, Container[_]] 

    标题为“Higher kinded types”,比如在Scala中的通用程序员,4.3节

    这有时会导致错误,因为许多人认为Container更高级别的types,而不是Iterable ,但更为确切的是,

    使用Container作为types更高的types(高阶)types的构造器参数在这里是Iterable

IntChar 这样的普通types,其实例是值,是* 。 像Maybe这样的一元types构造函数的types是* -> * ; 二元types的构造函数,例如:( curried )kind * -> * -> * ,等等。 您可以查看像MaybeEither这样的types作为types级别的函数:它们采用一种或多种types,并返回一个types。

如果函数的顺序大于1,则顺序是(非正式)函数箭头的左侧的嵌套深度:

  • 订单0: 1 :: Int
  • Order 1: chr :: Int -> Char
  • 2: fix :: (a -> a) -> amap :: (a -> b) -> [a] -> [b]
  • 顺序3 : ((A -> B) -> C) -> D
  • 顺序4: (((A -> B) -> C) -> D) -> E

所以,长话短说,一个更高级的types只是一个types级别的高阶函数。

  • 订单0: Int :: *
  • 订单1: Maybe :: * -> *
  • Order 2: Functor :: (* -> *) -> Constraint -higher-kinded:将一元types构造函数转换为typestypes约束

我会说:更高的kindedtypes抽象了一个types的构造函数。 例如考虑

 trait Functor [F[_]] { def map[A,B] (fn: A=>B)(fa: F[A]): F[B] } 

在这里, Functor是一个“更高级的types”(用在“更高types的generics”论文中)。 它不是一个具体的(“一阶”)types的构造函数像List (它只抽象适当的types)。 它抽象所有一元(“一阶”)types的构造函数(用F[_] )。

或者换一种说法:在Java中,我们有明确的types构造函数(例如List<T> ),但我们没有“更高级的types”,因为我们不能抽象它们(例如,我们不能写上面定义的Functor接口 – 至less不是直接的 )。

术语“高阶(types构造函数)多态性”用于描述支持“更高亲和types”的系统。