在 F# 中使用空列表或 "list option" 哪个更好?

Is it better to use an empty list or "list option" in F#?

在 F# 的域模型中使用可能为空的列表时是否有最佳实践?例如,在一个待办事项应用程序中,一个任务可以有 0 到 N 个子任务。首选哪种建模方式?

type Task :
    { Name : string
      SubTasks : Task list option }

type Task :
    { Name : string
      SubTasks : Task list } //potentially empty

我是一个初学者,但在我看来,业务逻辑可以与任何一种实现一起使用。我会通过检查选项类型或检查长度 = 0 的列表长度来验证没有子任务。

如果我们将 ParentTask : Task option 的值添加到 Task 记录类型中,也许将 SubTasks 列表也作为一个选项会更好?

谢谢!

仅当值 NoneSome [] 之间存在有意义的差异时才使用 Task list option。否则你只是添加了一个冗余的可能状态,需要用 Option.map 等到处处理

听起来这两种状态在你的域中没有区别,所以你应该只使用 Task list.

此外,在某些情况下,空列表不会保护您。如 List.averageBy、List.max 等函数需要一个非空列表。对于那些你可能想使用的情况 NonEmptyList 选项

此处定义了 NonEmptyList

https://fsprojects.github.io/FSharpx.Collections/reference/fsharpx-collections-nonemptylist.html