首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Scala中调试功能代码

在Scala中调试功能代码
EN

Stack Overflow用户
提问于 2010-11-25 08:36:47
回答 6查看 12.2K关注 0票数 34

调试功能代码肯定比调试命令式代码更棘手。请参阅讨论hereherehere。“函数式”调试应该支持检查函数/闭包/单体的返回值。有没有调试器/IDE有(计划有)检查中间返回值的能力?

例如,要在Scala中调试这一行,我应该能够单步执行4个函数调用,并在返回r之前检查每个步骤的返回值

代码语言:javascript
运行
复制
val r=(ls filter (_>1) sort (_<_) zipWithIndex) filter {v=>(v._2)%2==0} map{_._1}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-25 10:37:15

我认为每个人的建议是把事情分解成更容易处理的部分,这是最好的方法。调试较小表达式的一个技巧是窃取Ruby的tap函数,如here所述。"tap“允许你像这样把一个表达式放在链的中间,也许还可以打印出一些调试值,如下所示:

代码语言:javascript
运行
复制
val ls = List(1,2,3).map(_ * 2)
                .tap(soFar => println("So far: " + soFar))
                .map(_ * 2)
println(ls)

这将打印出来:

到目前为止的列表:

(2,4,6)

列表(4,8,12)

它每隔一段时间就对我有帮助。

票数 37
EN

Stack Overflow用户

发布于 2010-11-25 12:37:10

在纯粹的函数式设置中,单步执行并不像您想象的那样有用。因为所有东西都是由纯函数组成的,所以您可以使用消除过程来单独测试这些部分。在懒惰的计算环境中,单步执行代码的用处更小。

例如,在Haskell中调试程序,您根本不会对跟踪函数调用感兴趣。您感兴趣的是中间函数返回值的跟踪。在任何函数式语言中,能够为任何表达式提供这样的跟踪将是一个非常有用的功能。

票数 11
EN

Stack Overflow用户

发布于 2010-11-25 09:31:28

我知道简洁是非常好的,我同意您的观点,IDE应该有助于在这些情况下进行调试。但就目前而言,我已经改变了我的编码风格,以帮助调试。以我个人的风格,我会把你的例子实现为:

代码语言:javascript
运行
复制
val noZeroLs = ls.filter(_>1)
val sortedLs = noZeroLs.sort(_<_)
val indexedNoZeroLs = sortedLs.zipWithIndex
val everySecondIndexedL = indexedNoZeroLs.filter(v => (v._2) % 2 == 0)
val everySecondL = everySecondIndexedL.map(_._1)

想出有意义的名称是困难的/费力的,但它确实可以帮助您识别愚蠢的but;可能有助于其他人理解正在发生的事情;并且肯定有助于调试。

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

https://stackoverflow.com/questions/4272797

复制
相关文章

相似问题

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