我对理解 type
的内容有点困惑在 scala
方法。
在文件中我读到 List[Int]
是一个类型,List 是一个类型构造函数。
但是什么关键字type
意味着当我写以下内容时?
val ls: scala.collection.immutable.List.type = scala.collection.immutable.List
以及如何
type
与 type
相关例如,可以将其定义为特征中的字段。
最佳答案
在 Scala val
像上面这样的赋值:
val name: Tpe = expression
Tpe
是标识符的类型 name
.因此:val x: List.type = List
List
的类型对象(又名列表模块或列表伴侣)是 List.type
.这表明它是一个单例。所有这些都与类型论中的类型构造函数的概念完全正交。类型构造函数
在类型论中,
List
(注意:不是同伴)既是类型(表示为 *
)又是类型构造函数(表示为 * -> *
),因为当您向 List
提供类型参数时(例如 Int)然后你有一个类型(即 List[Int]
)。 Scala 为这种构造提供了语法。例如:def foo[F[_]]: F[Int]
^^^^ ^^^
| + supply a type argument to F[_]
|
+ the type constructor F[_]
但是,除非您对
F
有更多了解,否则您无法真正实现这种方法。 .例如,如果存在隐式 scalaz.Monad[F]
,您可以使用 Monad.pure
构建您的 F[Int]
的值(value)像这样:def foo[F[_]: Monad]: F[Int] = Monad[F].pure(1)
在斯卡拉
Scala 确实让你绕过
List
作为类型构造函数作为此类方法的类型参数。例如:scala> def foo[F[_]]: F[Int] = ???
foo: [F[_]]=> F[Int]
scala> lazy val x = foo[List]
x: List[Int] = <lazy>
然而
List
您在 foo[List]
中提供不是同伴注意
foo
的声明将导致以下警告:<console>:11: warning: higher-kinded type should be enabled
by making the implicit value scala.language.higherKinds visible.
This can be achieved by adding the import clause 'import
scala.language.higherKinds'
or by setting the compiler option -language:higherKinds.
See the Scaladoc for value scala.language.higherKinds for a discussion
why the feature should be explicitly enabled.
def foo[F[_]]: F[Int] = ???
^
关于scala - 什么是类型,什么是 scala 中的类型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45300288/