使用不可变对象的F#待办事项列表

使用不可变对象的F#待办事项列表,f#,immutability,F#,Immutability,我试图弄清楚如何使用不可变对象在F#中创建待办事项列表。待办事项列表(不一定是F#列表)可以从数据库中提取,或者从用户输入中收集,或者从XML或JSON中读取,等等。这一部分并不重要 伪代码: 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

我试图弄清楚如何使用不可变对象在F#中创建待办事项列表。待办事项列表(不一定是F#列表)可以从数据库中提取,或者从用户输入中收集,或者从XML或JSON中读取,等等。这一部分并不重要

伪代码:

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列表或其他可变对象吗

我不需要完全充实的工作代码,只需要一些关于如何将这些东西组合在一起的想法

更新:第一次尝试(半)编码这个东西:

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”方法。我不喜欢的是它的尾部调用不是递归的,所以每次递归都会占用堆栈空间

递归和/或延续是将循环中具有可变结构的代码转换为不可变结构的典型策略。如果您知道如何编写递归的“List.filter”,那么您可能会有一些正确的想法。

该计划的哪一部分您不知道如何处理不可变对象?为什么?您认为问题出在哪里?在for循环中,删除列表项以使do循环的下一次迭代看不到它们。与其考虑如何从to-do列表中添加/删除指令,不如考虑在该过程之后您希望得到的结果:一个没有完成指令的to-do列表<代码>待办事项列表->处理每个项目的说明->返回未完成任务的新列表(并将返回的列表用作新的待办事项列表)我第一次尝试更新了帖子。我正在考虑递归,但被卡住了。(我还更新了伪代码,以表明我希望在do循环中的两次尝试之间等待一段时间。)内部循环只能在to-do列表上进行一次迭代。完成后,do循环需要等待一段时间(待定),然后使用(可能修改过的)列表重新运行for循环\