【发布时间】: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