斯卡拉缺少的参数类型类型类操作
问题描述:
我有以下代码:斯卡拉缺少的参数类型类型类操作
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。
答
唯一可以省略匿名函数参数类型的情况是,当它在具有预期类型的上下文中使用时,此预期类型是函数类型(或者,从Scala 2.12开始,是SAM类型) 。重载方法的参数没有预期的类型,因为它的类型需要知道首先选择过载。所以你需要给两个!>
方法提供不同的名称。
现在了解。我正在使用2.12.0并更改!>映射到#>。如果我为每次使用#>(或使用括号)分配变量,它将起作用。但是,如果我尝试并链接它,它会失败:''不能证明双⇒双= = = scala.util.Try [双]。 \t - 方法#>没有足够的参数:(隐式ev:=:= [Double ⇒ \t Double,scala.util.Try [Double]])scala.util.Try [Double]。未指定的值参数ev。“你能告诉我为什么吗? – user2051561
这显然是在寻找错误的证据,但很难说为什么没有看到实际的代码。您可以尝试通过'Try [A]'上的隐式类来提供'#>',并避免使用'=:='。 –
我要为此设置另一个问题。同时,我会按照你的建议尝试隐式课程。感谢您花时间看这个。 – user2051561