使用不可变对象的F#todo列表

时间:2017-04-20 12:56:14

标签: 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 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”方法。我不喜欢的是它不是尾调用递归,因此会为每次递归消耗堆栈空间。

1 个答案:

答案 0 :(得分:2)

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