這與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)
}
但是,當然,這也不行,因爲適用的方法是不是發生在Function2
類型參數。
我可以用一個基本的DEF:
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)}'。你可以詳細說明你正在做什麼,它看起來像任何一種類型模式會讓你的生活變得更輕鬆或者斯卡拉狀態monad – 4lex1v
只是好奇:你爲什麼要避免把東西放在包對象中? –
我想問題是我想能夠使用'addOne'作爲函數對象,並且在'S'類型變化的各種情況下使用它。這樣可以,因爲addOne不關心S是什麼,它只是傳遞它。但是現在我意識到這在JVM中是不可能的。 –