2017-04-20 4 views
1

不変オブジェクトを使用してF#でto doリストを実行する方法を理解しようとしています。 to doリスト(必ずしもF#リストではない)は、データベースから取得されるか、ユーザー入力から収集されるか、XMLやJSONなどから読み取られる可能性があります。その部分はあまり重要ではありません。不変オブジェクトを使用するF#todoリスト

擬似コード:

do for some length of time: 
    for each item in the to do list: 
     if item is ready to do: 
     do item 
     if it worked: 
      remove from the todo list 

    wait a bit before trying again 
report on items that weren't ready or that failed. 

リストを行うには、少なくとも命令(「ファイルのコピー」、「プロセスの開始」、「電子メールの送信」を持つことになりますF#のレコードのいくつかのコレクションになります、 「昇給を求める」)と、サブコレクションとしてのパラメータが含まれています。

このようなことは、不変オブジェクトだけで行うことはできますか?または、私は.NETリストまたは他の変更可能なオブジェクトを使用する必要がありますか?

私はこのようなことをどのようにまとめていくかということについて、ちょっとしたアイデアを出しています。

UPDATE:(ハーフ)での最初の試みこの事をコーディング:

let processtodo list waittime deadline = 
    let rec inner list newlist = 
     match list with 
     | [] when not List.isEmpty newlist -> 
       inner newlist [] 

     | head :: tail when head.isReady-> 
       let res = head.action 
       inner tail (if res = true then tail else list) 

     | head :: tail when not head.isReady -> 
       inner tail list 

     | _ when deadline not passed -> 
      // wait for the waittime 
      inner list 
     | _ -> report on unfinished list 

    inner list [] 

私は多くの例で見られる典型的なやり方でこれを書いてみました。私はアイテムが "isReady"と "action"メソッドをサポートしていると仮定しました。私が気に入らないのは、再帰的なテールコールではないため、再帰ごとにスタックスペースを消費します。

+1

不変オブジェクトの処理方法がわからない計画の具体的な部分は何ですか?どうして?あなたは何を問題と認識していますか? –

+0

forループで、doループの次の反復にdoループが表示されないようにリスト項目を削除します – user1443098

+1

To-Doリストから命令を追加/削除する方法を考える代わりに、そのプロセスの後に:完了した指示のないリストを行う。 'to-do-list - >すべての項目の指示を処理する - >完了したタスクなしで新しいリストを返す'(そして、返されたリストを新しいdo-doリストとして使う) –

答えて

2

ループ内の可変構造を持つコードを不変構造に変換するための典型的な方法は、再帰および/または継続です。あなたが再帰的な "List.filter"を書く方法を知っているなら、あなたはおそらく正しい道にあるいくつかのアイデアを持っているでしょう。

+0

私は再帰を考えていましたが、固まってしまいました。 (私はdo-loopの試行の間にちょっと待たなければならないことを示すために擬似コードも更新しました)。内部ループはto-doリストに対して1回の繰り返ししか行わなければなりません。それが終了すると、do-loopはちょっと待ってから(改訂された可能性のある)リストを使ってforループを再実行する必要があります。\ – user1443098

+0

最初の試みで投稿を更新しました。 – user1443098

関連する問題