2016-11-23 161 views
0

我有以下代碼:斯卡拉缺少的參數類型類型類操作

class Pipe[ A ](a: A) { 
    def |>[ B ](f: A => B) = f(a) 
    def !>[ B ](f: A => B) : Try[B] = Try(f(a)) 
    def !>[ B, C ](f: B => C)(implicit ev: A =:= Try[B]) : Try[C] = a.map(f) 
} 

(隱式和應用不包括在內)

我有「缺失的參數類型」錯誤的問題。 下面的代碼編譯正確:

val r1 = 5 |> (x => x + 1) 

但是下面無法編譯:

val r6 = 100 !> { x => x * 2 } 

除非我寫:

val r6 = 100 !> { x : Int => x * 2 } 

那麼,如何各地要鍵入獲得功能?

我尋找類似問題的答案。一種解決方案是咖喱功能。但是在這種情況下,我認爲問題是當A =:= Try [B]時從類Pip [A]的類型A流向B的類型 。

欣賞任何指針。

TIA。

回答

2

唯一可以省略匿名函數參數類型的情況是,當它在具有預期類型的​​上下文中使用時,此預期類型是函數類型(或者,從Scala 2.12開始,是SAM類型) 。重載方法的參數沒有預期的類型,因爲它的類型需要知道首先選擇過載。所以你需要給兩個!>方法提供不同的名稱。

+0

現在瞭解。我正在使用2.12.0並更改!>映射到#>。如果我爲每次使用#>(或使用括號)分配變量,它將起作用。但是,如果我嘗試並鏈接它,它會失敗:''不能證明雙⇒雙= = = scala.util.Try [雙]。 \t - 方法#>沒有足夠的參數:(隱式ev:=:= [Double ⇒ \t Double,scala.util.Try [Double]])scala.util.Try [Double]。未指定的值參數ev。「你能告訴我爲什麼嗎? – user2051561

+1

這顯然是在尋找錯誤的證據,但很難說爲什麼沒有看到實際的代碼。您可以嘗試通過'Try [A]'上的隱式類來提供'#>',並避免使用'=:='。 –

+0

我要爲此設置另一個問題。同時,我會按照你的建議嘗試隱式課程。感謝您花時間看這個。 – user2051561