-->

这是Scala更高kinded类型?(Is this a higher kinded type in

2019-09-17 01:59发布

有如下定义

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

可以映射被定义为高kinded类型?

Answer 1:

它不应该。

你可以用价值和功能的类比。 你有基本的价值观,这是没有的功能,如5"foo" 。 你有那么简单的功能,这需要简单的值作为参数和返回简单的值,比如+length 。 高阶函数是具有其他功能作为参数或结果的函数。 例如takeWhilemap ,或foldLeft是高阶函数。

如果你考虑的类型,也有简单的类型,这是实际值的类型,比如IntString ,甚至Int => String和列表[双](现在我认为每一个值,简单与否,包括函数)。 再就是parameteric类型,也可称为类型构造(美其名曰输入功能将使比喻更清晰)。 名单(不instanciating泛型参数)是不是真的值的类型,你不能声明VAL是公正的类型List ,它必须是List[Something] 。 因此,名单可被视为给定一个简单的类型(比如智力)返回另一个简单的类型(列表[INT])的功能。 IntStringDouble和Int =>字符串据说有一种 * ,同时List了那种* -> * 。 参数化类型,如ListMap都是简单的功能类似。

正如一个高阶函数与功能(而不是简单值)参数的函数,高阶型(或有时更高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他们中的很多。



Answer 2:

你有什么不是,kinded较高的类型,但它可以很容易地修改是这样。

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

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

type MyMap = MyMap2[String, Int, String]

“高级kinded”只是意味着它是一个类型,它是无人居住的,并且需要以创造一个可居住的类型来提供与其他类型的。



文章来源: Is this a higher kinded type in Scala?