【问题标题】:Scala missing parameter type in type class operatorScala 在类型类运算符中缺少参数类型
【发布时间】:2017-04-07 18:43:53
【问题描述】:

我有以下代码:

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 compiler-errors type-inference type-parameter


    【解决方案1】:

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

    【讨论】:

    • 现在就明白了。我正在使用 2.12.0 并将 !> 映射更改为 #>。如果我将变量分配给 #> 的每次使用(或使用括号),它就可以工作。但是,如果我尝试将这些链接起来,它会失败:"Cannot prove that Double ⇒ Double =:= scala.util.Try[Double]. - not enough arguments for method #>: (implicit ev: =:=[Double ⇒ Double,scala.util.Try[Double]])scala.util.Try[Double]. Unspecified value parameter ev." 你能告诉我为什么吗?
    • 它显然是在寻找错误的证据,但如果没有看到实际代码,很难说为什么。您可以尝试通过 Try[A] 上的隐式类提供 #>,并避免使用 =:=
    • 我要设置另一个问题。同时,我将按照您的建议尝试隐式课程。感谢您花时间看这个。
    • 对于那些感兴趣的人,这里是对上一期的反向引用:stackoverflow.com/questions/40788426/…
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2022-01-21
    相关资源
    最近更新 更多