什么是斯卡拉更高的kindedtypes?
您可以在网上find以下内容:
-
较高的亲属types==types的构造函数?
class AClass[T]{...} // For example, class List[T]
有人说这是一个更高级的types,因为它抽象了符合定义的types。
更高的亲属types是其他types的types,并构build一个新的types
这些虽然也被称为types构造函数 。 (例如, 在Scala中编程 )。
-
更高的kindedtypes==types构造函数,它将types构造函数作为types参数?
在更高类的generics中 ,您可以阅读
…抽象types的抽象types('高级types')…“
这表明这一点
class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // eg trait Functor[F[_]]
是一个更高的kindedtypes。
因此,考虑到这一点,很难区分types构造函数 , 更高版本types和types构造函数作为types参数的types构造函数 ,因此上述问题。
让我通过一些消除歧义的方式来弥补这个混乱。 我喜欢用价值层面的类比来解释这一点,因为人们往往更熟悉它。
types构造函数是一种types,可以应用于input参数来“构造”一个types。
值构造函数是一个值,您可以将其应用于值参数以“构造”一个值。
价值构造函数通常被称为“函数”或“方法”。 这些“构造函数”也被认为是“多态的”(因为它们可以用来构造不同“形状”或“抽象”的东西(因为它们抽象了不同的多态实例之间的变化)。
在抽象/多态性的背景下,一阶是指抽象的“单一使用”:你抽象一次types,但是这种types本身不能抽象任何东西。 Java 5generics是一阶的。
对上述抽象特征的一阶解释是:
types构造函数是一种types,您可以将其应用于正确的types参数以“构造”适当的types。
值构造函数是一个值,您可以将其应用于适当的值参数来“构造”一个适当的值。
为了强调没有涉及的抽象(我猜你可以称之为“零阶”,但是我没有看到这个在任何地方使用过),比如值1
或String
types,我们通常会说某些东西是“合适的”值,或者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和类似于Functor
或Monad
的更高types (对抽象types抽象的types)区分合适的types ,如Int
或List[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
。
像Int
和Char
这样的普通types,其实例是值,是*
。 像Maybe
这样的一元types构造函数的types是* -> *
; 二元types的构造函数,例如:( curried )kind * -> * -> *
,等等。 您可以查看像Maybe
和Either
这样的types作为types级别的函数:它们采用一种或多种types,并返回一个types。
如果函数的顺序大于1,则顺序是(非正式)函数箭头的左侧的嵌套深度:
- 订单0:
1 :: Int
- Order 1:
chr :: Int -> Char
- 2:
fix :: (a -> a) -> a
,map :: (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”的系统。