2016-11-23 162 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