2009-10-27 181 views
8

如何製作一個懶惰列表來表示一個雙倍數字序列?例如:Ocaml:懶惰列表

1 2 4 8 16 32 
+1

你是指懶惰列表的一些特定實現,或者只是一般概念?另外,你是否真的需要懶惰_lists_(其中的值,一旦計算出來,被記住),或者你真的只想要一個流(其中值不記憶,因此只能被讀取一次)? – 2009-10-27 16:43:52

+0

我在找流。 – 2009-10-27 16:44:34

回答

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

這是標準庫處理這一。

這個問題也很類似於這樣的問題:

What OCaml libraries are there for lazy list handling?

+0

第一個鏈接不再工作,他們移動主機? – Oleg 2017-03-06 19:23:40

+0

@Oleg看起來像域名過期。這就是互聯網上的生活。這個答案現在差不多8歲了:) – chollida 2017-03-07 21:55:39

+0

電池庫現在有[三種不同的或多或少的惰性序列類型](https://github.com/ocaml-batteries-team/batteries-included/wiki/ListTypes),具有不同的屬性。 – Mars 2018-01-20 18:11:31

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 
    
+0

我的'lazy_list'的哪部分被破壞?我在寫代碼時沒有對它進行測試,而且我確實比OCaml更熟悉Haskell和SML,但我剛剛測試了它,它在OCaml 3.11.1上運行。數據流主要是因爲OP在詢問數據流的問題上添加了一條評論。 – ephemient 2009-10-27 19:05:33

+0

Woops,你是對的,我真的*誤會了......另外我沒有看到關於使用流的評論。下次我會把眼鏡放在:s。 – jdb 2009-10-27 21:54:36

3

此外,在我的OCaml Network Application Environment核心基金會中有一個名爲Cf_seq的懶惰列表模塊。實際上,我寫了一整套函數式數據結構。它全部在2分條款的BSD許可下提供。請享用。

更新:代碼已被重命名爲「Oni」,它現在託管在BitBucket。您也可以使用GODI軟件包。