8
A
回答
9
偉大的博客解放的頭腦,對這個話題有很大的文章:
http://enfranchisedmind.com/blog/posts/ocaml-lazy-lists-an-introduction/
您還可以檢查出http://batteries.forge.ocamlcore.org/doc.preview%3Abatteries-beta1/html/api/Lazy%5Flist.html
這是標準庫處理這一。
這個問題也很類似於這樣的問題:
13
使用流:
let f x = Stream.from (fun n -> Some (x * int_of_float (2.0 ** float_of_int n)))
或
let f x =
let next = ref x in
Stream.from (fun _ -> let y = !next in next := 2 * y ; Some y)
使用自定義lazy_list
類型:
type 'a lazy_list =
| Nil
| Cons of 'a * 'a lazy_list lazy_t
let rec f x = lazy (Cons (x, f (2*x)))
1
如果你想通過做手工,我說你必須主要選項:
使用自定義
lazy_list
型,如ephemient說(除了他的解決方案是一個有點壞) :type 'a lazy_list = | Nil | Cons of 'a * 'a lazy_list let head = function | Nil -> failwith "Cannot extract head of empty list" | Cons (h, _) -> h let tail = function | Nil -> failwith "Cannot extract tail of empty list" | Cons (_, t) -> t
用一種thunk的(如用於實現在不支持此功能的語言懶評價的東西)。你可以將你的列表定義爲函數
unit -> 'a
,該函數說明如何從當前元素獲取下一個元素(不需要爲此使用流)。例如,定義所有自然數的列表,如果你做print_int (naturals()); print_int (naturals()); print_int (naturals())
,你會得到下面的輸出,你可以做
let make_lazy_list initial next = let lazy_list current() = let result = !current in current := (next !current); result in lazy_list (ref initial) let naturals = make_lazy_list 0 (function i -> i + 1)
的:
0 1 2
3
此外,在我的OCaml Network Application Environment核心基金會中有一個名爲Cf_seq
的懶惰列表模塊。實際上,我寫了一整套函數式數據結構。它全部在2分條款的BSD許可下提供。請享用。
相關問題
- 1. 在ocaml中的懶惰評價
- 2. 懶惰過濾列表
- 3. 懶惰的素數列表
- 4. Elixir懶惰列表理解?
- 5. jQuery Mobile懶惰加載列表項
- 6. 在圖庫中使用懶惰列表
- 7. 懶惰列表的好分區實現?
- 8. Grails:懶惰列表的問題
- 9. json數據與懶惰列表
- 10. 片段中的懶惰列表
- 11. F#懶惰評估與非懶惰
- 12. 懶惰評價不那麼懶惰?
- 13. Clojure素數懶惰序列
- 14. Java正則表達式懶惰操作符不那麼懶惰?
- 15. 懶惰選擇
- 16. hGetContents太懶惰
- 17. preg_match懶惰?
- 18. 關於懶惰
- 19. 懶惰評價
- 20. 是getLine懶惰?
- 21. 懶惰SlidingDrawer
- 22. 從非IO列表創建懶惰IO列表
- 23. Swift中的懶惰
- 24. SimpleInjector RegisterAll懶惰地
- 25. C#懶惰問題
- 26. 懶惰在C++ 11
- 27. PHP懶惰評估
- 28. 懶惰加載flexslider
- 29. Hadoop的懶惰distributedcache
- 30. GWT懶惰加載
你是指懶惰列表的一些特定實現,或者只是一般概念?另外,你是否真的需要懶惰_lists_(其中的值,一旦計算出來,被記住),或者你真的只想要一個流(其中值不記憶,因此只能被讀取一次)? – 2009-10-27 16:43:52
我在找流。 – 2009-10-27 16:44:34