Scala中匿名函数的隐式参数

时间:2014-04-09 12:22:10

标签: scala implicit

我对匿名函数的隐式参数有点困惑。希望有人能指出正确的方向。这就是我所拥有的。两个文件:Main.scalaFoo.scala

// Foo.scala
trait Fun[-A, +B] extends (A => B)

trait ImplicitString[+B] {
  def withString(block: String => B)(implicit s: String): B = block(s)
}

object FooFun extends Fun[String, String] with ImplicitString[String] {
  def apply(x: String): String = withString { implicit s =>
    x + s
  }
}

// Main.scala
object Main extends App {
  implicit val s = "it works!"
  println(FooFun("Test:"))
}

我希望看到Test: it works!打印出来。但是我收到了编译错误:

$ scalac Main.scala Service.scala
Service.scala:8: error: could not find implicit value for parameter s: String
  def apply(x: String): String = withString { implicit s =>
                                        ^
one error found

我错过了什么吗?

更新

看起来我应该像这样导入我的隐式val:

// Foo.scala
import Main._
...

这很好用。

1 个答案:

答案 0 :(得分:1)

如果您要在函数内直接使用s,那么就没有必要将其标记为隐式。

你可以用这种方式解决这个问题,

object FooFun extends Fun[String, String] with ImplicitString[String] {
  def apply(x: String)(implicit s1:String): String = withString { s =>
    x + s
  }
}

问题是,implicit val s的申请方法正文无法看到FooFun