小编She*_*III的帖子

有选择地禁用Scala中的包含?(正确输入List.contains)

List("a").contains(5)
Run Code Online (Sandbox Code Playgroud)

因为a Int永远不会包含在列表中String,所以这应该在编译时生成错误,但事实并非如此.

它浪费并默默地测试String列表中包含的每个内容的相等性5,这些内容永远不会成立(在Scala中"5"永远不等于5).

这被称为" '包含'问题 ".而一些人暗示,如果一个类型系统无法正确地输入这样的语义,那么为什么要经过强制执行类型的额外的努力.所以我认为这是一个需要解决的重要问题.

类型参数化B >: AList.contains输入的任何类型的是该类型的超类型A(包含在列表中的元素的类型).

trait List[+A] {
   def contains[B >: A](x: B): Boolean
}
Run Code Online (Sandbox Code Playgroud)

此类型参数化是必要的,因为+A声明列表在类型上是协变A,因此A不能在逆变位置中使用,即作为输入参数的类型.协变列表(必须是不可变的)对于扩展比强制列表(可以是可变的)更强大.

AString在上面的例子有问题,但Int不是的超类型String,所以发生了什么事?该隐含包容 Scala中,决定Any是两者的相互超StringInt.

Scala的创建者Martin Odersky 建议修复将限制输入类型B仅限于那些具有equals方法的类型Any.

trait List[+A] …
Run Code Online (Sandbox Code Playgroud)

scala contains list covariance implicit-cast

22
推荐指数
3
解决办法
1162
查看次数

价值限制

在OCaml中,您无法概括部分应用的curried函数("值限制").

价值限制的目的是什么?如果它不存在会发生什么不愉快?

ocaml

11
推荐指数
2
解决办法
1892
查看次数

Scala.JS 配置用于 Scala 3?

我尝试向 Scala 用户发布这个问题,但尚未回复。如何通过 Scala.JS 使用新的实验性 Scala 3?我无法\xe2\x80\x99找到令人信服的说明。

\n

令人震惊的是,我在互联网上找不到任何关于这个主题的信息。

\n

例如,我读到(并在 Scala 3 源代码中验证),当集成被编译到 dotc 编译器中时,没有插件。那么我应该如何处理 Scala.js 网站上指示我向构建文件添加插件的说明呢?

\n

scala scala.js

5
推荐指数
1
解决办法
502
查看次数

标签 统计

scala ×2

contains ×1

covariance ×1

implicit-cast ×1

list ×1

ocaml ×1

scala.js ×1