当隐式派生所需类型时,Scala不应用隐式转换

当隐式派生所需类型时,Scala不应用隐式转换,scala,implicit-conversion,Scala,Implicit Conversion,我可能遇到了一个版本的链式隐式转换问题()。我不知道该怎么处理 我在下面附上了一个例子来说明这个问题。让我在这里补充一些细节: 1) 我希望有一个类似以下的方法: def chainedTransform[A, B, C](a: A)(f1: F[A, B], f2: F[B, C]): C 它应该将值从类型A转换为类型C 2) 可能会发生具有必要类型参数的转换器F不在范围内,但存在令人满意的隐式转换 3) 下面的代码片段演示了整个方法 test("Mutliple conversions

我可能遇到了一个版本的链式隐式转换问题()。我不知道该怎么处理

我在下面附上了一个例子来说明这个问题。让我在这里补充一些细节:

1) 我希望有一个类似以下的方法:

def chainedTransform[A, B, C](a: A)(f1: F[A, B], f2: F[B, C]): C
它应该将值从类型
A
转换为类型
C

2) 可能会发生具有必要类型参数的转换器
F
不在范围内,但存在令人满意的隐式转换

3) 下面的代码片段演示了整个方法

  test("Mutliple conversions") {
    val f1: Function1[String, Int] = (s) => s.toInt
    val f2: Function1[Int, Boolean] = (i) => i > 0
    val f3: Function[Option[Int], Option[Boolean]] = (iOpt) => iOpt map (_ > 0)

    implicit def toOptFun[A, B](f: Function1[A, B]): Function1[Option[A], Option[B]] =
      new Function1[Option[A], Option[B]] {
        override def apply(v1: Option[A]): Option[B] = v1 map f
      }

    case class Test[A](param: A) {
      def transform[B](t1: Function1[A, B]): B = t1(param)
      def chainedTransform[B, C](t1: Function1[A, B], t2: Function1[B, C]): C = t2(t1(param))
    }

    val test1 = Test("123")
    assert(test1.chainedTransform(f1, f2))

    val test2 = Test(Option("123"))
    //toOptFun implicit conversion is applied successfully
    assert(test2.transform(f1) == Some(123))

    //Does not compile: 
    //test2.chainedTransform(f1, f2)
    //  [error]  found   : Int => Boolean
    //  [error]  required: Option[Int] => Boolean
    //  [error]     test2.chainedTransform(f1, f2)
    //  [error]                                ^

    //f3 is exactly what toOptFun(f2) would produce if applied
    assert(test2.chainedTransform(f1, f3) == Some(true))
  }

有什么想法可以让它工作吗?

这只是因为Scala试图为
test2.chainedTransform(f1,f2)
选择错误的类型。如错误消息所示,编译器正在查找
选项[Int]=>Boolean
,而您所拥有的只是到
选项[Int]=>Option[Boolean]
的隐式转换

如果您向编译器提示您真正想要的类型注释,则所有内容都将编译

test2.chainedTransform(f1, f2): Option[Boolean]

作为旁注,
chainedTransform
在函数的特定情况下是反向函数合成(函数上的
方法),更一般地说是箭头上的反向合成()。

你确定箭头的事情吗?
>
是否等同于