What is the difference between $ (dollar) and $! (dollar exclamation point)
有人能解释一下操作工($)和($!)之间haskell的区别吗?
到目前为止,我还没有看到在任何地方使用$!,但是在浏览haskell引用时,我注意到它的存在,并且它的定义与$完全相同。在haskell解释器(ghci)中尝试一些简单的语句时,我找不到任何区别,也找不到在搜索haskell tutorial时在列出的最上面的教程中对运算符的任何引用。
所以,出于好奇,有什么区别吗?
- hiyf hoogle haskell.org /:/?Q=24 28 % %!格式= 29 % &;夏洛克
- 因此stackoverflow.com湖/问题/ 940382 / & hellip;
($!)是严格的功能应用。这是我的论点,它evaluates评价函数。
这是违反正常的懒惰的功能应用在Haskell中,例如f x或f $ x是开始,第一,函数的参数和fx只计算,如果它是需要的。
例如succ (1 + 2)想加延时的1 + 2通过创建一thunk,和评估的succ启动第一。如果参数是一个只读访问成功,想1 + 2被加载。
然而,如果你知道一个确信的观点,我需要的功能,你可以使用($!)论点,第一,希望到弱的头正常形式,然后回车键的功能。这种方式,您don’t create a Whole of thunk大桩,这可以更高效。在这个例子succ $! 1 + 2会先计算,然后回车3succ函数。
注意,它是不总是安全的感觉replace功能正常与功能应用严格的应用。例如:
- 最后一个例子是关于error的副作用。功能语义不应该受到bang的伤害(对于par和seq)。放刘海有时会增加速度/记忆,有时会减少。在某些特殊情况下,它会导致无休止的计算。
- 好吧,打印消息是一个副作用,但重点是error是(底部)。就像永无止境的计算是。如果使用seq来评估,程序的语义就会改变。这就是为什么你应该谨慎对待像seq和($!)这样的事情,它可以提高(或降低)你程序的效率,但也可能使它在正常情况下不应该发生的情况下崩溃。
一个海上部队的评价函数,这一价值。美元!一个术语的定义。
这是一个博客的一些细微差别,其节目使用。
- 啊,愚蠢的我!在《以东记》中也有这样的说法,但是由于某种原因,等号从来没有响过铃……感谢您提供博客链接。
- f $! x = x ``seq`` f xhackage.haskell.org/packages/archive/base/latest/doc/html/sr‌&误8203;c/…