在F#中选择建立任意(或结果)

jsp*_*kes 7 monads f#

我根据Scott Wlaschin 博客中的信息建立了一个成功/失败的monad,并提供了这个堆栈溢出帖子的额外帮助.我最终得到了一个类型

type Result<'a> = 
| Success of 'a
| Error of string
Run Code Online (Sandbox Code Playgroud)

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

我试过了

type Result<'a> = Choice<'a, string>
let Success = Choice1Of2
let Error = Choice2Of2
Run Code Online (Sandbox Code Playgroud)

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

    match getMetaPropertyValue doc name with
    | Error msg -> ()
    | Success value -> value
Run Code Online (Sandbox Code Playgroud)

Gus*_*Gus 9

您还需要一个活动模式:

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
Run Code Online (Sandbox Code Playgroud)

然后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
Run Code Online (Sandbox Code Playgroud)

这就是我在这里做的方式.