我正试图弄清楚如何使用不可变对象在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”方法。我不喜欢的是它不是尾调用递归,因此会为每次递归消耗堆栈空间。
答案 0 :(得分:2)
递归和/或延续是将循环中的可变结构转换为不可变结构的代码的典型策略。如果你知道如何编写一个递归的“List.filter”,那么你可能会有一些想法在正确的轨道上。