【问题标题】:Scala type parameters for objects对象的 Scala 类型参数
【发布时间】:2014-03-13 13:24:22
【问题描述】:

这与 this question 有关,但我看不出使用存在类型对我的情况有何帮助。

我正在努力实现以下目标:

type MonadicArithmeticFunc[S] = (Int, S) => (Int, S)

object addOne[S] extends MonadicArithmeticFunc[S] {
  def apply(n: Int, s: S): (Int, S) = (n + 1, s)
}

val state = Seq.empty[Int]
println(addOne(4, state))

但是这不起作用,因为不能向对象添加类型参数。我也尝试使用存在类型:

object addOne extends MonadicArithmeticFunc[_] {
  def apply[S](n: Int, s: S): (Int, S) = (n + 1, s)
}

但这当然也不起作用,因为 apply 方法不是采用 Function2 中的类型参数。

我可以使用基本的定义:

def addOne[S](n: Int, s: S): (Int, S) = (n + 1, s)

除了我必须在包对象中声明它以获得相同的范围。还有其他想法吗?

【问题讨论】:

  • 你想要达到的目标毫无意义,你的 ArithmeticFunc 在任何意义上都不是一元的,也没有理由将它用作超类,因为你可以简单地写object addOne { def apply[S](n: Int, s: S): (Int, S) = (n + 1, s) }。你能详细说明你想要做什么吗,看起来任何一种类型的类模式都会让你的生活更轻松或 scalaz State monad
  • 只是好奇:为什么要避免在包对象中放入一些东西?
  • 我想问题是我希望能够将addOne 用作函数对象,并在S 的类型不同的各种情况下使用它。这没关系,因为addOne 不在乎 S 是什么:它只是通过它。但现在我意识到这在 JVM 中是不可能的。

标签: scala object type-parameter


【解决方案1】:

object 设置类型参数(或构造函数参数)根本没有意义,因为addOne[Int]addOne[String] (可能)是不同的对象,但关键字@987654324 @ 表示应该只有一个对象。你可以有

class addOne[S] extends MonadicArithmeticFunc[S] {
  def apply(n: Int, s: S): (Int, S) = (n + 1, s)
}

object addOne {
  def apply[S] = new addOne[S]
}

如果您出于某种原因真的需要MonadicArithmeticFunc。但正如 Alexlv 所说,

object addOne {
  def apply[S](n: Int, s: S) = (n + 1, s)
}

通常会更好。

【讨论】:

  • 我喜欢类+对象的例子。我试试看。
  • 是的,我可以看出这是 JVM 的限制:每种类型都有不同的对象。因为addOne 不在乎S 的实际类型是什么,所以我希望该Function2 只有一个运行时对象——基本上在运行时SObject——但没有任何强制转换。我想我只需要为每种类型分配单独的 addOne 实例。
猜你喜欢
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多