类型类运算符

时间:2016-11-23 16:38:59

标签: scala compiler-errors type-inference type-parameter

我有以下代码:

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 =:=时,从类Pip [A]的A类到B =尝试[B]。

欣赏任何指针。

TIA。

1 个答案:

答案 0 :(得分:2)

您可以省略匿名函数的参数类型的唯一情况是在具有预期类型的​​上下文中使用它时,此预期类型是函数类型(或者,从Scala 2.12开始,SAM类型)。重载方法的参数没有预期的类型,因为首先需要知道其类型以选择重载。因此,您需要为两个!>方法指定不同的名称。