gpt4 book ai didi

f# - 定义可区分联合的默认值

转载 作者:行者123 更新时间:2023-12-04 22:09:47 25 4
gpt4 key购买 nike

我想为受歧视的联合定义一个默认值,如下所示:

open System.Linq

type Result =
| Ok
| Error

let results : seq<Result> = [] |> Seq.ofList

let firstResult = results.FirstOrDefault()
// I want firstResult to be Error, currently it is null.

option<'a> 以这种方式工作(firstResult 将是 None),所以它应该是可能的。
谢谢你的帮助。

编辑:
我正在使用 SQLDataProvider 并想编写类似的代码
let userEmail =
query {
for user in dbContext.Public.Users do
where (user.Id = 42)
select (Ok user.Email)
headOrDefault
// should result in Error
// when no user with Id=42 exists
}

我的实际结果类型如下所示:
type Result<'a> =
| Ok of 'a
| Failure of string // Expected, e. g. trying to log in with a wrong password
| Error // Unexpected

返回一个选项,调用者将无法区分失败和错误。

最佳答案

通常,F# 避免使用默认值的概念,而是使所有内容尽可能明确。返回一个选项并让调用者决定特定用例的默认设置更为惯用。
FirstOrDefault 方法只能为任何类型返回 .NET 的默认值。因此,对于任何类,它将返回 null ,对于数字,它将返回零。

我会推荐这种方法,而不是假设您想要的默认值是 Ok :

results |> Seq.tryHead |> Option.defaultValue Ok

关于f# - 定义可区分联合的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50304567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com