是否有使用严格评估的Haskell编译器或预处理器?

Zif*_*fre 19 compiler-construction haskell lazy-evaluation

我正在寻找一个Haskell编译器,它默认使用严格的评估而不是延迟评估.我只想使用OCaml,但Haskell的语法比OCaml 好得多(而且Haskell是纯粹的,并且具有很酷的功能,比如类型类).

我真的宁愿不经常把!s和$!s全部放在我的程序上.带有开关或预处理器的编译器可以输入严格的注释,这非常好.如果有一种方法在某些地方使用延迟评估也是有帮助的,以防万一我想要无限列表(我可能永远不会).

请不要试图说服懒惰的评价更好,我真的需要表现.IIRC,西蒙佩顿琼斯甚至说,懒惰的评价是不是真的有必要,它在那里主要是为了防止他们的语言不纯.

Don*_*art 17

我真的宁愿不经常把!和$!s全部放在我的程序中

你做错了,如果你正在编程Haskell :)你根本不需要这样做.使用GHC,使用-O2,在适当的时候使用严格的数据类型,在适当的时候使用懒惰的数据类型.不要认为懒惰会成为一个问题 - 这是解决许多问题的方法.


por*_*ges 16

如果你有一个使用严格评估的Haskell编译器,它不会编译Haskell. 怠惰 非严格性是Haskell规范的一部分!

但是,还有其他选择.

  • DDC试图创建一个显式惰性的Haskell变体,它支持破坏性更新之类的东西,同时保留Haskell所有其余的优点.有一个问题:编译器目前只处于α阶段,尽管它似乎至少可用.

  • 像其他人一样创建预处理器.

  • 学会以"正确的方式"使用Haskell.如果您可以将测试用例简化为可公开显示的内容,则可以将其发布在Haskell-Café邮件列表中,在这些列表中,人们对这些关于非严格性影响的问题非常有帮助.

  • 确切地说,非严格性是Haskell规范的一部分,而不是懒惰.懒惰只是GHC选择的评估顺序. (4认同)

GS *_*ica 12

过去有两次严格评估Haskell的尝试:

但两者都专注于坚持Haskell的非严格语义,但使用的是严格的评估策略,而不是真正改变语义,而且都没有真正看到过光明.

编辑:Martijn对strict-plugin的建议看起来非常适合您的目的,因为它实际上做了您想要的并且作者仍然活跃在Haskell社区中,我已经忘记了它.


Mar*_*ijn 8

另请参阅ghc-strict-plugin,这是GHC插件框架的一个示例,在Monad Reader 12有所描述.


Cur*_*son 7

我感觉到你的痛苦.在我的日常编程中,我最大的PITA就是处理那些!@#$%^&(空间泄漏.

但是,如果它有所帮助,那么随着时间的推移你会学习(艰难的)如何处理这个问题,并且确实会变得更好.但是我还在等待Andy Gill带着他神奇的太空泄漏探测器来解决我的所有问题.(我在最后一次ICFP上对他进行了他的副评论,他认为这个很酷的想法是实现它的承诺.)

我不会试图说服你,懒惰的评价是世界上最好的,但它有一些好处.我有一些流处理程序可以通过任何种类的组合器来搜索惰性列表,这些组合器在使用大约3.5 MB左右的内存(其中大于2MB是GHC运行时)时可以快速运行数十亿字节的数据.还有一个比我去年更聪明的人,你会真的很惊讶,作为一个典型的Haskell程序员,你有多依赖于懒惰的评估.

但我们真正需要的是一本关于在现实世界中处理懒惰评估的非常好的书(这与学术界没那么不同,真的,除了他们根本没有发表论文,我们让客户来到我们之后用刀子)将适当地涵盖与此相关的大部分问题,更重要的是,让我们直观地了解什么会爆炸我们的堆,什么不是.

我不认为这是新事物; 我确信其他语言和架构也经历过这一点.毕竟,第一批程序员是如何处理硬件堆栈的呢?不太好,我敢打赌.

  • 顺便说一句,你可以在Template Haskell的帮助下,制作各种各样的`NFData`实例,并且可以很多次地使用wazoo.我学到了很难,这不是最好的解决方案,除了真正吹灭你的CPU缓存.... (2认同)

sha*_*apr 5

我认为Jan-Willem Maessan的pH编译器是严格的.下一个最接近的是Robert Ennal对ghc 5的推测性评估分析.peclection_eval分支并不严格,而是乐观地评估.我不知道其中任何一个是否仍然是当前/可用/等.


小智 5

在任何地方使用nfdata和rnf都不是解决方案,因为它意味着重复遍历已经评估过的大型结构.

Ben Lippmeier的博士论文(关于DDC)的介绍性章节是关于我见过的对Haskell的最佳批评 - 它讨论了懒惰,破坏性更新,monad变换器等问题.DDC有懒惰但你必须明确要求它,它被认为是一种效果,由DDC的类型和效果系统跟踪和管理.


Jon*_*ock 5

我最近在这方面看到了一些工作:

https://ghc.haskell.org/trac/ghc/wiki/StrictPragma

您可以在SPJ的GHC状态更新中听到一点关于它的信息:

http://youtu.be/Ex79K4lvJno?t=9m33s (链接从9:33的相关部分开始)