2012-08-09 59 views
1

是否有一個簡單的Seq.unfold版本,只是將前一個元素作爲狀態?我知道你可以很容易地適應Seq.unfold這樣做,但結果是不太可讀。更簡單的Seq.unfold在F#

回答

3

我不認爲有一個內置函數來做到這一點。

重複使用Seq.unfold將是很煩人的相同的模式,但你可以很容易地使用unfold定義,只要你想,然後只用了新的功能,其行爲的函數:

module Seq = 
    let generate f v = 
    Seq.unfold (fun v -> let r = f v in Some(r, r)) v 

順便說一句,如果我想實現這個模式,我可能會用一個簡單的遞歸序列表達式,這可能比使用Seq.unfold更容易閱讀。該generate功能可以實現這樣的:

let rec generate f v = seq { 
    yield v 
    yield! generate f (f v) } 

這不同表現了一下,因爲它產生的第一個值也是如此。不知道你想要什麼行爲。

1

Tomas的回答很好,但正如你所說,使用Seq.unfold來做這件事很醜陋,正如他所說,他的generate函數的行爲有所不同。

如果你想相同的行爲Seq.unfold,它使用以前的元素狀態,這應該這樣做:

let rec unfold f state = 
    seq { 
    match f state with 
    | Some x -> 
     yield x 
     yield! unfold f x 
    | None ->() 
    }