gpt4 book ai didi

scala - 查看更高级类型的边界

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

我正在尝试设置一个绑定(bind)到高类型类型的 View ,并且收到一条我无法理解的错误消息。

$ scala -language:higherKinds
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait F[M[_]]
defined trait F

scala> def foo[M[_]](implicit m: M[_] => F[M]) = 42
foo: [M[_]](implicit m: M[_] => F[M])Int

scala> def bar[M[_] <% F[M]] = 42
<console>:8: error: type M takes type parameters
def bar[M[_] <% F[M]] = 42
^

不应该 bar编译成与 foo 相同的东西?我错过了什么?

最佳答案

请注意,M[_] 之间存在细微差别。在类型参数列表和类型M[_] (即 M[_] 在隐式参数列表中的函数类型中所起的作用)。第一个是类型构造函数参数,第二个是存在类型(更多信息参见 Scala language specification 的 4.4 和 3.2.10 节)。

例如,我们可以替换类型构造函数参数 M[_]M[X]不改变含义,但在后一种情况下这将是一个语法错误(它是 M[X] forSome { type X } 之类的简写)。

以下示例中的差异可能更清楚(编译得很好):

scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int

这里是第一个 M[_]是类型构造函数参数,第二个( M_ 的上限)是存在类型。

Scala 编译器可以想象 M[_] <% F[M]像你期望的那样工作——也就是说,它可以将类型构造函数参数转换为它为上下文绑定(bind)创建的隐式参数类型中的存在类型——但这需要一点额外的编译器魔法,而且还有已经足够了。

关于scala - 查看更高级类型的边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448113/

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