在 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 列表也作为一个选项会更好?
谢谢!
仅当值 None
和 Some []
之间存在有意义的差异时才使用 Task list option
。否则你只是添加了一个冗余的可能状态,需要用 Option.map
等到处处理
听起来这两种状态在你的域中没有区别,所以你应该只使用 Task list
.
此外,在某些情况下,空列表不会保护您。如 List.averageBy、List.max 等函数需要一个非空列表。对于那些你可能想使用的情况
NonEmptyList 选项
此处定义了 NonEmptyList
https://fsprojects.github.io/FSharpx.Collections/reference/fsharpx-collections-nonemptylist.html
在 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 列表也作为一个选项会更好?
谢谢!
仅当值 None
和 Some []
之间存在有意义的差异时才使用 Task list option
。否则你只是添加了一个冗余的可能状态,需要用 Option.map
等到处处理
听起来这两种状态在你的域中没有区别,所以你应该只使用 Task list
.
此外,在某些情况下,空列表不会保护您。如 List.averageBy、List.max 等函数需要一个非空列表。对于那些你可能想使用的情况 NonEmptyList 选项
此处定义了 NonEmptyList
https://fsprojects.github.io/FSharpx.Collections/reference/fsharpx-collections-nonemptylist.html