如果按值调用和按名称调用有效,两者是否都会传递相同的结果?例如:
import Debug.Trace
trace :: String -> a -> a
foo x y z = y + y + z
z = foo (trace "first" 1)
(trace "second" 2)
(trace "third" 3)
Call-By-Value: "first second third" 7
Call-By-Name: "second second third" 7
Lazy Evaluation: "second third" 7这种情况我们会得到三个不同的结果,但为什么?
发布于 2015-10-08 20:07:02
不,你每次都得到同样的结果:7。
其他信息(“第一条”等)由于使用了调试函数Debug.Trace.trace,该函数用于生成一条消息,该消息公开了表达式的精确计算方式。编程执行的“如何”部分通常不被视为语义的一部分,即结果的一部分,相反,结果只考虑返回“什么”。
例如,
let f x = x in f 10 + f 10是20,和
let f x = x in 2 * f 10但是,如果我们加上痕迹,
let f x = trace "msg" x in f 10 + f 10因为我们两次调用这个函数,所以两次打印"msg“。相反,
let f x = trace "msg" x in 2 * f 10印一次“味精”。这仅仅表明评估是不同的,而不是结果是不同的。
在正常的“生产”代码中,程序员不应该依赖诸如Debug.*模块中的调试辅助工具来生成消息。实际上,这会破坏纯函数式编程的许多优点,应该只用于调试目的。
https://stackoverflow.com/questions/33021264
复制相似问题