相关疑难解决方法(0)

Scala - 如何定义引用自身的结构类型?

我正在尝试编写一个泛型interpolate方法,该方法适用于任何具有两种方法的类型,a *和a +,如下所示:

trait Container {
  type V = {
    def *(t: Double): V
    def +(v: V): V
  }

  def interpolate(t: Double, a: V, b: V): V = a * (1.0 - t) + b * t
}
Run Code Online (Sandbox Code Playgroud)

这不起作用(在Scala 2.8.0.RC7上),我收到以下错误消息:

<console>:8: error: recursive method + needs result type
           def +(v: V): V
                        ^
<console>:7: error: recursive method * needs result type
           def *(t: Double): V
                             ^
Run Code Online (Sandbox Code Playgroud)

如何正确指定结构类型?(或者有更好的方法吗?)

scala structural-typing

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

自我指责鸭子打字

我希望编写一个函数,该函数可以处理任何可以添加到其自身类型的其他成员的值(无论"添加"在上下文中是什么意思).这种类型的明显(嘿嘿)定义:

type Addable = { def +(a : Addable) : Addable }
Run Code Online (Sandbox Code Playgroud)

这给了我一个我根本不懂的错误:递归方法+需要结果类型

为什么不是最后: Addable的结果类型?为什么它认为+是递归的呢?

但我发现了一个更普遍的问题,试图在自己的定义中引用一个类型:

type T = { def f: T  }     
Run Code Online (Sandbox Code Playgroud)

但后来我有了一个脑波:用Java的方式解决它!

type T[T] = { def f: T  } 
Run Code Online (Sandbox Code Playgroud)

这个汇编了!

但现在我还有两个问题.

首先,我不知道如何使用T型.特别是,

def n(a:T) = a.f
Run Code Online (Sandbox Code Playgroud)

给出完全明智但令人沮丧的"类型T取类型参数"错误.

其次,尝试将此模式应用于原始问题

type Addable[Addable] = { def +(a : Addable) : Addable }
Run Code Online (Sandbox Code Playgroud)

导致一个完全不可理解的"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型".(实际的问题并不在于它是"+" - 感谢上帝和马丁,因为那会让我的脑袋变得一团糟 - 只需要一个Addable作为参数.)

所以

  1. 如何定义鸭子类型含义"有一个特定的函数返回相同类型的值"?
  2. 如何定义鸭子类型含义"有一个特定的函数采用与参数相同的表达式"?

我有一种宗教般的信念,认为这个问题是可以解决的.

scala

4
推荐指数
1
解决办法
882
查看次数

标签 统计

scala ×2

structural-typing ×1