这与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)
除了我必须声明在包对象中获得相同的范围。还有其他想法吗?
答案 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)
}
通常更可取。