我正在觀看約翰休斯的採訪,他被問到當他從哈斯克爾轉到厄蘭時他是否錯過了懶惰。作爲回答,他說是的,他用工具「模仿」它。 我的問題是:如何用嚴格的語言模仿懶惰?在主流語言中看到很酷的例子會很高興。如何模仿懶惰
Q
如何模仿懶惰
7
A
回答
7
通常的訣竅是使用lambda
(我想那將是Erlang的fun
)。
下面是一個使用Ruby的一個例子:
的基本想法是很簡單...你你想偷懶,把它包在一個零參數匿名函數,那麼無論表達取當你想強迫它時評估這個功能。
1
你可能想看看python生成器的細節。
總之,這些對象有一個__next__
消息,它允許他們產生一個項目。因此,它們可以組成,以便每個步驟的處理都可以從下一個組合的發生器中抽取一個項目。
這樣,python程序員可以輕鬆地使用無限序列(或長度爲1的序列)。
2
如果您只想模擬非嚴格性,那麼您只需將表達式包裝到函數中並在需要時調用它。
如果你真的想模仿懶惰(即對記憶不嚴格),那麼你需要將該函數包裝成可變引用。素描OCaml中(忽略例外):
type 'a lazy = 'a thunk ref
and 'a thunk = Lazy of unit -> 'a | Memo of 'a
let lazy f = ref (Lazy f)
let force l = match !l with
| Lazy f -> let x = f() in l := Memo x; x
| Memo x -> x
除OCaml中已經有這個預定義在其圖書館(在某種程度上,也負責處理根據f例外)。
相關問題
- 1. Haskell中的懶惰模式
- 2. 如何界定懶惰和
- 3. F#懶惰評估與非懶惰
- 4. 懶惰評價不那麼懶惰?
- 5. 懶惰加載模塊基座模板
- 6. 懶惰選擇
- 7. hGetContents太懶惰
- 8. preg_match懶惰?
- 9. 關於懶惰
- 10. 懶惰評價
- 11. 是getLine懶惰?
- 12. 懶惰SlidingDrawer
- 13. 任何()評估懶惰?
- 14. Swift中的懶惰
- 15. SimpleInjector RegisterAll懶惰地
- 16. C#懶惰問題
- 17. 懶惰在C++ 11
- 18. PHP懶惰評估
- 19. 懶惰加載flexslider
- 20. Hadoop的懶惰distributedcache
- 21. GWT懶惰加載
- 22. F#懶惰遞歸
- 23. 懶惰的評價
- 24. Android懶惰加載
- 25. 懶惰類別名?
- 26. 懶惰評價python
- 27. 懶惰加載Ninject
- 28. Autofac懶惰加載
- 29. Eclipselink懶惰加載
- 30. Ocaml:懶惰列表