语法 – 为什么Scala自动应用thunk,有时?
在
ShadowofCatron的
Scala Tutorial 3 video的2:40之后,它指出,在
thunk之后的括号是可选的。 “Buh?”说我的功能编程大脑,因为一个函数的价值和它应用时的评估值是完全不同的东西。
所以我写下来试试这个。我的思想过程在评论中描述。 object Main { var counter: Int = 10 def f(): Int = { counter = counter + 1; counter } def runThunk(t: () => Int): Int = { t() } def main(args: Array[String]): Unit = { val a = f() // I expect this to mean "apply f to no args" println(a) // and apparently it does val b = f // I expect this to mean "the value f",a function value println(b) // but it's the value it evaluates to when applied to no args println(b) // and the application happens immediately,not in the call runThunk(b) // This is an error: it's not println doing something funny runThunk(f) // Not an error: seems to be val doing something funny } } 要清楚的问题,这个Scheme程序(和控制台转储后面)显示了我期望的Scala程序。 (define counter (list 10)) (define f (lambda () (set-car! counter (+ (car counter) 1)) (car counter))) (define runThunk (lambda (t) (t))) (define main (lambda args (let ((a (f)) (b f)) (display a) (newline) (display b) (newline) (display b) (newline) (runThunk b) (runThunk f)))) > (main) 11 #<procedure:f> #<procedure:f> 13 在访问这个网站询问这个问题后,我遇到了this answer告诉我如何修复上面的Scala程序: val b = f _ // Hey Scala,I mean f,not f() 但是下划线“提示”只是有时需要。当我调用runThunk(f),不需要提示。但是当我’别名’到b与一个val然后应用它,它不工作:应用程序发生在val;和甚至惰性val工作这种方式,所以它不是评价导致这种行为的点。 这一切都留给我的问题: 为什么Scala有时会在评估它们时自动应用thunk? 是否,我猜想,类型推理?如果是这样,一个类型系统不应该停留在语言的语义之外? 这是一个好主意吗? Scala程序员应用thunk,而不是参考他们的值,更多的是,使括号是可选的更好的整体? 使用Scala 2.8.0RC3编写的示例,R5RS中的DrScheme 4.0.1。 解决方法
问题在这里:
是的,但是你没有声明任何函数。 def f(): Int = { counter = counter + 1; counter } 你声明了一个名为f的方法,它有一个空的参数列表,并返回Int。方法不是一个函数 – 它没有值。永远不能。你最好做的是通过反射获得一个Method实例,这是不是真的是一回事。 val b = f _ // Hey Scala,not f() 那么,f _是什么意思?如果f是一个函数,它将意味着函数本身,授予,但这不是这里的情况。它真正意味着这是: val b = () => f() 换句话说,f _是一个方法调用的闭包。闭包通过函数实现。 最后,为什么在Scala中空参数列表是可选的?因为虽然Scala允许声明,如def f = 5,但Java不。 Java中的所有方法至少需要一个空参数列表。还有许多这样的方法,在Scala样式中,不会有任何参数(例如,长度和大小)。因此,为了使代码看起来更均匀的空参数列表,Scala使它们是可选的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |