2

前の要素を状態として使用する、より単純なSeq.unfoldバージョンはありますか?私はあなたがそれをするのに簡単に適応できることを知っていますSeq.unfold、しかし結果はあまり読みにくいです。

4

2 に答える 2

4

それを行う組み込み関数はないと思います。

を使用して同じパターンを繰り返すのは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) }

これは、最初の値も生成するため、動作が少し異なります。どのような動作が必要かわからない。

于 2012-08-09T12:14:08.620 に答える
2

トーマスの答えは良いですが、あなたが言ったように、Seq.unfoldこれを行うために使用することは醜いです、そして彼が言ったように、彼のgenerate機能は異なった振る舞いをします。

と同じ動作が必要Seq.unfoldであるが、前の要素を状態として使用する場合は、次のようにする必要があります。

let rec unfold f state = 
  seq {
    match f state with
    | Some x ->
      yield x
      yield! unfold f x
    | None -> ()
  }
于 2012-08-09T14:22:33.737 に答える