标签: bounded-quantification

Scala将递归有界类型参数(F-bounded)转换为类型成员

我将如何转换:

trait Foo[A <: Foo[A]]
Run Code Online (Sandbox Code Playgroud)

一个类型的成员?

也就是说,我想要的东西如下:

trait Foo {
  type A <: Foo {type A = ???}
}
Run Code Online (Sandbox Code Playgroud)

但我遇到了困难,因为名称A已经在类型细化中被采用.这个问题类似(并衍生自):通过类型成员而不是类型参数进行F限制量化?

types scala parametric-polymorphism type-members bounded-quantification

11
推荐指数
1
解决办法
440
查看次数

无法将表示类型实现为类型成员

虽然在另一个问题上开头,但我遇到了似乎相关的不同谜语.这是其中之一:

trait Sys[S <: Sys[S]] {
  type Peer <: Sys[Peer]
}

trait Fenced {
  type Peer <: Sys[Peer]
}

def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
Run Code Online (Sandbox Code Playgroud)

错误如下:

error: overriding type Peer in trait Fenced with bounds >: Nothing <: Sys[this.Peer];
 type Peer has incompatible type
       def makeFence[S <: Sys[S]] = new Fenced { type Peer = S#Peer }
                                                      ^
Run Code Online (Sandbox Code Playgroud)

为什么?(也试图自我类型添加_:S =>Sys,没有问题)


虽然Rex的答案使得构造Fenced对象成为可能,但它并没有真正解决我在使用类型投影(S#Peer)时表示类型字符丢失的问题.我想出了另一种造成更严格限制的情景; 我认为这是核心问题:

trait …
Run Code Online (Sandbox Code Playgroud)

types scala abstract-type type-projection bounded-quantification

8
推荐指数
1
解决办法
136
查看次数

理解Scala中的"类型参数不符合类型参数边界"错误

以下为什么不工作?

scala> abstract class Foo[B<:Foo[B]]
defined class Foo

scala> class Goo[B<:Foo[B]](x: B)
defined class Goo

scala> trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
<console>:9: error: inferred type arguments [Hoo[B] with B] do not conform to class Goo's type parameter bounds [B <: Foo[B]]
       trait Hoo[B<:Foo[B]] { self: B => new Goo(self) }
                                         ^

scala> trait Hoo[B<:Foo[B]] extends Foo[B] { new Goo(this) }
<console>:9: error: inferred type arguments [Hoo[B]] do not conform to class Goo's type parameter bounds [B …
Run Code Online (Sandbox Code Playgroud)

scala bounded-quantification

6
推荐指数
1
解决办法
2669
查看次数

存在类型或类型参数绑定失败

我有一个F-bounded类型Sys:

trait Sys[S <: Sys[S]]
Run Code Online (Sandbox Code Playgroud)

以及将其作为类型参数的一些特征:

trait Foo[S <: Sys[S]]
Run Code Online (Sandbox Code Playgroud)

假设我有一个方法可以调用Foo:

def invoke[S <: Sys[S]](foo: Foo[S]) = ()
Run Code Online (Sandbox Code Playgroud)

假设我有一个模型更新类型,以及一个带有以下内容的子类型Foo:

sealed trait Update
case class Opened[S <: Sys[S]](foo: Foo[S]) extends Update
Run Code Online (Sandbox Code Playgroud)

用于注册模型观察者的辅助函数:

def observe(pf: PartialFunction[Update, Unit]) = ()
Run Code Online (Sandbox Code Playgroud)

现在以下失败:

observe {
  case Opened(foo) => invoke(foo)
}
Run Code Online (Sandbox Code Playgroud)

<console>:16: error: inferred type arguments [Any] do not conform to method invoke's
                     type parameter bounds [S <: Sys[S]]
                case Opened(foo) => invoke(foo)
                                    ^
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决部分功能,如Sys,Foo …

scala pattern-matching existential-type type-bounds bounded-quantification

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