scala - 什么是类型,什么是 scala 中的类型构造函数

标签 scala

我对理解 type 的内容有点困惑在 scala方法。

在文件中我读到 List[Int]是一个类型,List 是一个类型构造函数。

但是什么关键字type意味着当我写以下内容时?

val ls: scala.collection.immutable.List.type = scala.collection.immutable.List

以及如何 typetype 相关例如,可以将其定义为特征中的字段。

最佳答案

在 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/

相关文章:

scala - 如何在使用 git 库的 IntelliJ IDEA 中设置 scala 项目

scala - 我的 API 都返回 Future[Option[T]],如何在 for-compr 中很好地组合它们

scala - 使用elastic4s在搜索中获得零结果

sql - Spark中的累积总和

scala - 将 Magnolia 与 Circe 的自动推导技巧相结合

scala - 输入隐式的同义词?

scala - 如何使用 akka 的 http 客户端设置最大内容长度?

scala - Spark : check your cluster UI to ensure that workers are registered

scala - 为什么关于抽象特征成员 val 初始化的微小变化结果会有所不同?

scala - 定义函数引用以保留其参数名称