我有面向对象的背景,并尝试过一些函数式scala代码作为blow,但为什么有些代码可以编译,而另一个不能:
def fun(a: Int => Int) = a(1)
def fun1(f: => Int => Int => Int) = {
fun { a => fun { b => f(a)(b) } }
}
fun1(Int=>Int=>Int) // it compiles but what's Int=>Int=>Int? it only define type, but no param name, how it work without compile error?
fun1(Int=>Int=>1)
fun1(a=>b=>a+b)
fun1(a=>b=>Int) // why this has compile error while other doesn't, such as fun1(Int=>Int=>1?另外,请帮助我理解前2个调用的值是1,而第三个调用的值是2。
发布于 2014-06-16 21:25:50
在您的前两个示例中,Int只是参数的名称,因此:
fun1(Int=>Int=>Int)等同于
fun1(a => a => a)其中外部参数由内部函数的参数遮蔽。
在您的上一个示例中,由于Int不是一个参数,因此它被认为是Int.type,所以您的最后一个示例实际上是:
fun1(_ => _ => Int.type)因为函数需要返回一个Int,所以这不会进行类型检查,因为Int.type与Int不兼容。
https://stackoverflow.com/questions/24244706
复制相似问题