【发布时间】:2014-10-17 06:56:32
【问题描述】:
我有一个这样的类型:
type TaskRow =
{
RowIndex : int
TaskId : string
Task : Task option
}
函数返回这些记录的列表以进一步处理。执行该处理的一些函数仅与 Task 为 Some 的 TaskRow 项目相关。我想知道最好的方法是什么。
天真的方法会做
let taskRowsWithTasks = taskRows |> Seq.filter (fun row -> Option.isSome row.Task)
并将其传递给那些函数,简单地假设Task 永远不会是None 并使用Task.Value,如果我不传入那个特殊列表,就会冒NRE 的风险。这正是当前 C# 代码所做的,但对于 F# 来说似乎相当单一。我不应该“假设”事情,而是让编译器告诉我什么会起作用。
更多的“功能”将是每次值相关时进行模式匹配,然后对choose 不执行/返回任何内容(并使用None 等),但这似乎重复且浪费,因为相同的工作会进行多次。
另一个想法是引入第二种略有不同的类型:
type TaskRowWithTask =
{
RowIndex : int
TaskId : string
Task : Task
}
然后将原始列表过滤成这种类型的“子列表”,以便在适当的地方使用。我想从功能的角度来看这没问题,但我想知道是否有更好的、惯用的方式而不求助于这种“帮助类型”。
感谢您的指点!
【问题讨论】: