对象的Scala类型参数

时间:2014-03-12 23:33:55

标签: scala object type-parameter

这与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中的type参数。

我可以使用基本的def:

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

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

1 个答案:

答案 0 :(得分:2)

object的类型参数(或构造函数参数)根本没有意义,因为addOne[Int]addOne[String](推测)不同的对象,但关键字object意味着只应该有一个对象。你可能有

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)
}

通常更可取。