我有OO背景并尝试了一些功能性scala代码,但为什么有些编译时却没有:
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。
答案 0 :(得分:3)
在前两个示例中,Int
只是参数的名称,因此:
fun1(Int=>Int=>Int)
与
相同fun1(a => a => a)
其中外部参数被内部函数的参数遮蔽。
在上一个示例中,由于Int
不是参数,因此它被视为Int.type
,因此您的最后一个示例是有效的:
fun1(_ => _ => Int.type)
由于该函数需要返回Int
,因此Int.type
与Int
不兼容,因此不会进行类型检查。