当隐式派生所需类型时,Scala不应用隐式转换
我可能遇到了一个版本的链式隐式转换问题()。我不知道该怎么处理 我在下面附上了一个例子来说明这个问题。让我在这里补充一些细节: 1) 我希望有一个类似以下的方法:当隐式派生所需类型时,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
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
在函数的特定情况下是反向函数合成(函数上的和
方法),更一般地说是箭头上的反向合成()。你确定箭头的事情吗?>
是否等同于和?