scala - self 参照鸭式打字

标签 scala

我希望编写一个函数,该函数对可以添加到其自身类型的其他成员(无论“添加”在上下文中意味着什么)的任何值进行操作。这种类型的明显(呵呵)定义:

type Addable = { def +(a : Addable) : Addable }

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

为什么最后一个 : Addable 不是结果类型?为什么它认为 + 无论如何都是递归的?

但是我发现了一个更普遍的问题,试图在它自己的定义中引用一个类型:
type T = { def f: T  }     

但后来我有了一个脑电波:用我在 Java 中的方式解决它!
type T[T] = { def f: T  } 

这编译!

但是现在我还有两个问题。

首先,我不知道如何使用类型 T。特别是,
def n(a:T) = a.f

给出了完全合理但令人沮丧的“类型 T 采用类型参数”错误。

其次,尝试将此模式应用于原始问题
type Addable[Addable] = { def +(a : Addable) : Addable }

导致完全无法理解的“结构细化中的参数类型可能不是指在该细化之外定义的抽象类型”。 (实际的问题不在于它是“+”——感谢上帝和马丁,因为这会让我完全搞砸——只是它需要一个 Addable 作为参数。)

所以
  • 如何定义鸭子类型,意思是“具有返回相同类型值的特定函数”?
  • 我如何定义一个鸭子类型,意思是“有一个特定的函数将相同类型的表达式作为参数”?

  • 我有一种宗教般的信念,即这个问题是可以解决的。

    最佳答案

    那些是不同的T。

    scala> type T[T] = { def f: T  } 
    defined type alias T
    
    scala> var x: T[Int] = null
    x: T[Int] = null
    
    scala> x = new AnyRef { def f = 5 }
    x: T[Int] = $anon$1@44daa9f1
    

    当你写:
    type Addable[Addable] = { def +(a : Addable) : Addable }
    

    您有一个 Addable 类型,它采用单个类型参数,也称为 Addable。这是人们经常混淆的类似变化。
    scala> def f[Int](x: Int) = x * x
    <console>:7: error: value * is not a member of type parameter Int
           def f[Int](x: Int) = x * x
                                  ^
    

    你的问题的实际答案是“你不能”,但我不想破坏你的宗教信仰,所以我会说“结构类型以神秘的方式工作”。如果您想进行宗教使命,您可以访问这里,这解释了为什么您不能。

    http://article.gmane.org/gmane.comp.lang.scala/7013

    关于scala - self 参照鸭式打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4332071/

    相关文章:

    scala - 有没有一种好方法可以对 `cats.effect.Resource` 中的错误处理进行精细控制?

    scala - 如何评估使用 InterfaceStability 注释的代码(失败并显示 "illegal cyclic reference involving class InterfaceStability")?

    scala - 如何从 Scala 设置环境变量?

    web-services - 响应式发送文件到 Play!2 Scala 中的 Web 服务

    scala - 如何在 Jupyter 内核中将外部 jar 添加到 Scala

    scala - Scala 中 for 循环加 2

    multithreading - Scala 和 Erlang 使用绿色线程吗?

    scala - Akka Http : Exceeded configured max-open-requests value of [32]

    scala - 是否可以将类型构造函数视为函数式编程语言中的类型?

    android - 使用 sbt android-plugin 的构建时间长