generics - f# 可区分联合泛型

标签 generics f# discriminated-union

可以返回值 'a 或错误值 'b 的通用 TryValue 类型的语法是什么?

type TryValue =
    | Value of 'a
    | Error of 'b

如果错误是一个字符串,那很好:

type 'a TryValue =
    | Value of 'a
    | Error of string

我想定义一个 tryRun 函数,它接受一个错误创建者、一个函数和一个参数,该函数将尝试使用该参数运行该函数,并在任何错误时使用错误创建者函数来创建一个错误:

let tryRun createErrorFn param fn =
    try 
        Value (fn param)
    with
        | ex  -> Error (createErrorFn ex.Message param)

以及由 tryRun 包装的任何函数的包装器:

let wrapTryRun createErrorFn fn param =
    match param with
    | Value a -> tryRun createErrorFn a fn
    | Error e -> Error e

现在我可以运行一个函数列表(伪代码,还没有完全解决):

let createErrorFn errorMessage param =
    URLProcessignError {url=param.url;errorMessage=errorMessage}
[fn1;fn2] |> List.fold (fun acc fn -> (wrapTryRun createErrorFn fn acc))

最佳答案

您缺少左侧的泛型参数:

type TryValue<'a,'b> =
    | Value of 'a
    | Error of 'b

当它只有一个参数时,您可以像处理字符串一样使用 ML 样式,但如果您有多个参数,则应使用带有 < 的 .NET 表示法>尖括号。

关于generics - f# 可区分联合泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672367/

相关文章:

Typescript 使用 Observable.of 区分联合类型

Typescript 标记的联合类型

f# - f# 中可区分联合的内置比较

generics - 实例化具有对变体记录的子类型访问权限的包时出现问题

mysql - 如何将 F# 连接到 MySQL 数据库?

java - 使用 Java 泛型可能会挂起编译器

c# - 为什么 "\u1FFF:foo".StartsWith (":") 返回 true?

facebook-graph-api - 使用 F# 从 Facebook 图形 API 检索数据

c# - 将泛型函数作为参数传递

generics - 将 F# 函数参数限制为通用接口(interface)的多个实例失败并显示 FS0193