在 F# 中的 Choice 之上构建 Either(或 Result)

building Either (or Result) on top of Choice in F#

我根据 Scott Wlaschin blog with extra help from this stack overflow posting 中的信息为 success/failure 构建了一个 monad。我最终得到了一个类型

type Result<'a> = 
| Success of 'a
| Error of string

我现在意识到这等同于 F# 中的 Choice 和 haskell 中的 Either。我想重用代码而不是保留自己的代码,但只想更改实现而不必更改现有代码。我想使用我现有的名称以及 Choice 的实现。 (或者可能是 fsharpx 中的扩展选择。)

我试过了

type Result<'a> = Choice<'a, string>
let Success = Choice1Of2
let Error = Choice2Of2

这几乎可以工作,但是当我在匹配中使用 Error 时,我收到错误消息“未定义模式鉴别器 'Error'。

    match getMetaPropertyValue doc name with
    | Error msg -> ()
    | Success value -> value

你想要let Error = Choice2Of2<string>。注意大写O.

您还需要一个活动模式:

type Result<'a> = Choice<'a,string>
let  Success x :Result<'a> = Choice1Of2 x
let  Error   x :Result<'a> = Choice2Of2 x
let  (|Success|Error|) = function Choice1Of2 x -> Success x | Choice2Of2 x -> Error x

然后 Either:

type Either<'a,'b> = Choice<'b,'a>
let  Right x :Either<'a,'b> = Choice1Of2 x
let  Left  x :Either<'a,'b> = Choice2Of2 x
let  (|Right|Left|) = function Choice1Of2 x -> Right x | Choice2Of2 x -> Left x

我就是这样做的here