我根据Scott Wlaschin的blog 中的信息建立了一个成功/失败的monad,并得到了stack overflow posting的额外帮助。我最终得到了一个类型
type Result<'a> =
| Success of 'a
| Error of string
我现在意识到这相当于F#中的Choice,而且是在haskell中。我想重用代码而不是保留自己的代码,但是只想更改实现而不必更改现有代码。我想使用我现有的名字以及Choice的实现。 (或者可能是fsharpx中扩展的选择。)
我试过了
type Result<'a> = Choice<'a, string>
let Success = Choice1Of2
let Error = Choice2Of2
这几乎可以工作,但是当我在匹配中使用Error时,我得到一个错误&#34;模式鉴别器&#39;错误&#39;没有定义。
match getMetaPropertyValue doc name with
| Error msg -> ()
| Success value -> value
答案 0 :(得分: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
然后是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。
答案 1 :(得分:0)
你想要let Error = Choice2Of2<string>
。请注意大写O
。