首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的按名调用与按值调用

Haskell中的按名调用与按值调用
EN

Stack Overflow用户
提问于 2015-10-08 16:30:04
回答 1查看 2K关注 0票数 2

如果按值调用和按名称调用有效,两者是否都会传递相同的结果?例如:

代码语言:javascript
复制
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

这种情况我们会得到三个不同的结果,但为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-08 20:07:02

不,你每次都得到同样的结果:7

其他信息(“第一条”等)由于使用了调试函数Debug.Trace.trace,该函数用于生成一条消息,该消息公开了表达式的精确计算方式。编程执行的“如何”部分通常不被视为语义的一部分,即结果的一部分,相反,结果只考虑返回“什么”。

例如,

代码语言:javascript
复制
let f x = x in f 10 + f 10

是20,和

代码语言:javascript
复制
let f x = x in 2 * f 10

但是,如果我们加上痕迹,

代码语言:javascript
复制
let f x = trace "msg" x in f 10 + f 10

因为我们两次调用这个函数,所以两次打印"msg“。相反,

代码语言:javascript
复制
let f x = trace "msg" x in 2 * f 10

印一次“味精”。这仅仅表明评估是不同的,而不是结果是不同的。

在正常的“生产”代码中,程序员不应该依赖诸如Debug.*模块中的调试辅助工具来生成消息。实际上,这会破坏纯函数式编程的许多优点,应该只用于调试目的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33021264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档