gpt4 book ai didi

scala - 为什么 Scala 不推断特征类型参数?

转载 作者:行者123 更新时间:2023-12-04 12:57:20 24 4
gpt4 key购买 nike

trait foo[F] {
def test: F
}

class ah extends foo[(Int,Int) => Int] {
def test = (i: Int,j: Int) => i+j
}

所以问题是,为什么众所周知的 Scala 在类型方面如此聪明,为什么不能从问我的 test 类型中推断出类型 (Int,Int) => Int而是指定它?还是还有可能?或者,这可能是由一些我没有想到的想法支持的。

最佳答案

您的问题基本上是“为什么 Scala 只有本地类型推断”或等效的“为什么 Scala 没有非本地类型推断”。答案是:因为设计师不想。

这有几个原因。原因之一是局部类型推断最合理的替代方案是全局类型推断,但这在 Scala 中是不可能的:Scala 具有单独的编译和模块化类型检查,因此根本没有时间点让编译器具有全局 View 程序。事实上,Scala 具有动态代码加载,这意味着在编译时整个代码甚至不需要存在!在 Scala 中,全局类型推断是根本不可能的。我们能做的最好的事情是“整体编译单元类型推断”,但这也是不可取的:这意味着您是否需要类型注释取决于您是在多个单元中编译代码还是仅在一个单元中编译代码。

另一个重要原因是模块边界处的类型注释用作双重检查,有点像类型的复式簿记。请注意,即使在像 Haskell 这样具有全局类型推断的语言中,强烈建议将类型注释放在模块边界和公共(public)接口(interface)上。

第三个原因是全局类型推断有时会导致令人困惑的错误消息,当类型检查器没有在类型注释上失败时,类型推断器会愉快地推断越来越无意义的类型,直到它最终 在远离 实际 错误(可能只是一个简单的错字)的位置放弃,并带有仅与错误站点的原始类型相切相关的类型错误。例如,这有时会发生在 Haskell 中。 Scala 设计者非常重视有用的错误消息,以至于他们愿意牺牲语言特性,除非他们能弄清楚如何用好的错误消息来实现它们。 (请注意,即使 Scala 的类型推断非常有限,您也可以获得诸如“预期 Foo 得到 Product with Serializable”这样的“有用”消息。)

然而,Scala的局部类型推断在这个例子中可以做的是反方向的工作,从test<的返回类型推断匿名函数的参数类型:

trait foo[F] {
def test: F
}

class ah extends foo[(Int, Int) ⇒ Int] {
def test = (i, j) ⇒ i + j
}

(new ah) test(2, 3) //=> 5

关于scala - 为什么 Scala 不推断特征类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43963814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com