我只是碰到了功能和对象之间的差距怪(斯卡拉2.10):Scala中defs/lambdas的隐式转换?
implicit def conv(c: Int => String) : (PrintStream => Int => Unit) = p => v => p.println(c(v))
def f(h: PrintStream => Int => Unit) : Unit = h(System.out)(1)
def a(x: Int) = x.toString
val b = (x: Int) => x.toString
// def main(args: Array[String]) = f(a) // fail
// def main(args: Array[String]) = f((x: Int) => x.toString) // fail
def main(args: Array[String]) = f(b) // ok
为什么会出现DEFS /λ文字和λ丘壑之间的差异?
更新:显然,问题不为二元函数发生:Implicit conversion of a function to a second-order-function only works if the function to convert has at least two parameters
我检查这个,乃至下面的代码工作:
implicit def conv(c: (Int,Unit) => String) : (PrintStream => Int => Unit) = p => v => p.println(c(v,()))
def f(h: PrintStream => Int => Unit) : Unit = h(System.out)(1)
def a(x: Int, y : Unit) = x.toString
val b = (x: Int, y : Unit) => x.toString
def main(args: Array[String]) = f(a) // ok
def main(args: Array[String]) = f((x: Int, y: Unit) => x.toString) // ok
def main(args: Array[String]) = f(b) // ok
同样的,无参函数不构成问题,要么:
implicit def conv(c:() => String) : (PrintStream => Int => Unit) = p => v => p.println(c())
def f(h: PrintStream => Int => Unit) : Unit = h(System.out)(1)
def a() = "1"
val b =() => "1"
def main(args: Array[String]) = f(a) // ok
def main(args: Array[String]) = f(() => "1") // ok
def main(args: Array[String]) = f(b) // ok
所以,改写的问题:为什么这不适用于UNARY方法和函数?
更新:问题似乎也与目标类型(f的参数类型h)有关。下面也可以(这个时候,有利于“埃塔膨胀算作跳”,因为我们需要从使用_创建方法值)
implicit def conv(c: Int => String) : Unit =()
def f(h: Unit) : Unit = System.out.print("?")
def a(x: Int) = x.toString
val b = (x: Int) => x.toString
def main(args: Array[String]) = f(a _) // ok
def main(args: Array[String]) = f((x: Int) => x.toString) // ok
def main(args: Array[String]) = f(b) // ok
m aybe scalac认为defs/lambda文字转换为FunctionN已经是一个隐式跳转(最多允许一个跳转)? – 2015-02-11 13:02:01
刚刚检查了规格。 Eta扩展应该是免费的,所以三者应该相当于w.r.t.查看应用程序:“我们说,如果T在应用eta-expansion *和* view应用程序后T弱地符合U,则类型T与U型兼容。” – 2015-02-11 16:07:30
http://stackoverflow.com/questions/28456012/implicit-conversion-of-a-function-to-a-second-order-function-only-works-if-the-f – 2015-02-12 02:21:49