回答
($!)
是严格的功能应用。也就是说,它在评估函数之前评估参数。
这与在Haskell,例如正常懒惰函数应用f x
或f $ x
,它首先开始评估函数f
,并且只在需要时计算参数x
。
例如succ (1 + 2)
将通过创建thunk来延迟添加1 + 2
,并开始首先评估succ
。只有当需要succ的参数时,才会评估1 + 2
。
但是,如果您确定始终需要函数的参数,则可以使用($!)
,它将首先评估参数为弱头标准形式,然后输入该函数。这样,你不会创建一大堆thunk,这可以更有效率。在此示例中,succ $! 1 + 2
将首先计算3
,然后输入函数succ
。
注意,它并不总是安全的,只需更换严格的功能应用的正常功能应用。例如:
ghci> const 1 (error "noo!")
1
ghci> const 1 $! (error "noo!")
*** Exception: noo!
最后一个例子更多关于'error'的副作用。功能语义永远不应该受到刘海的伤害(“par”和“seq”相同)。放置刘海有时可能会增加速度/记忆力,有时会减少。在某些特殊情况下,它可能会导致永无止境的计算'const 1 $! (最后[1 ..])'。 – ony 2010-05-09 12:47:11
那么,信息的印刷是一个副作用,但重点是'错误'是⊥(底部)。就像一个永无止境的计算是⊥。如果你使用'seq'来评估⊥,你的程序的语义会改变。这就是为什么你应该小心诸如'seq'和'($!)',它可以增加(或减少)你程序的效率,但它也可能使它崩溃在通常不应该有的地方。 – 2010-05-09 19:19:16
啊,愚蠢的我!它在zvon上也是如此描述'$!',但由于某种原因,等号不会响起... 感谢您的博客链接。 – 2010-05-07 10:07:37
'f $! x = x''seq'' f x' http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Prelude。html#%24%21 – 2011-08-03 21:02:54
尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17886026) – guradio 2017-11-09 07:29:16
- 1. swift中的问号和感叹号有什么区别?
- 2. 美元符号和美元符号之间的区别是什么,然后是JQuery中的一段时间?
- 3. Haskell中美元符号($)和括号之间的区别是什么?
- 4. 什么是Asterisk和感叹号准许的意义美国
- 5. [undefined]和[,]之间的区别是什么?
- 6. 什么是“&!”在Linux的shell(符号和感叹号)意思
- 7. ++和:haskell之间的区别是什么?
- 8. $(())和expr之间的区别是什么?
- 9. $(...)和`...`之间的区别是什么
- 10. 感叹号操作符?
- 11. cmd和感叹号
- 12. 双感叹号?
- 13. 冒号“:”和胖箭头“>”之间的区别是什么?
- 14. 的感叹号
- 15. 区别:%% a和%variable%变量之间的区别是什么?
- 16. [EmailPasswordAuthProvider,EmailAuthProvider]之间的区别是什么
- 17. 感叹SRC之前做些什么 - HTML
- 18. MVC和MVVM之间的区别和相似之处是什么?
- 19. 什么使反引号和撇号之间有很大区别?
- 20. 感叹号在VB.NET
- 21. @observable和@published之间有什么区别
- 22. TVF/UDF之间的区别是什么
- 23. {0}和“”之间有什么区别?
- 24. PEG和CFG之间有什么区别?
- 25. SQL语句中的反引号和方括号之间的区别是什么?
- 26. KVC和Properties之间有什么区别?
- 27. 正常运行时间和uptime_since_flush_status之间的区别是什么
- 28. 线和三网,魔杖和triand之间的区别是什么?
- 29. x [1,1]和x.item(1,1)之间的区别是什么?
- 30. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之间有什么区别?
HIYF:http://www.haskell.org/hoogle/?q=%28%24!%29&format=sherlock – jberryman 2010-05-07 21:19:25
另请参阅http://stackoverflow.com/questions/940382/haskell-difference-between-点和美元符号 – 2011-04-19 01:44:50