选择<'T1,'T2>的Monadic操作

Fre*_*ler 5 f# computation-expression

choice在标准库中找不到一个允许我写的对象

let safeDiv (numer : Choice<Exception, int>) (denom : Choice<Exception, int>) =
    choice {
        let! n = numer
        let! d = denom
        return! if d = 0
            then Choice1Of2 (new DivideByZeroException())
            else Choice2Of2 (n / d)
    }
Run Code Online (Sandbox Code Playgroud)

就像在Haskell.我是否想念任何东西,或者是否有第三方图书馆来写这类东西,还是我必须重新发明这个轮子?

Aar*_*ach 5

该类型没有内置计算表达式Choice<'a,'b>.通常,F#没有常用Monad的内置计算表达式,但它确实提供了一种相当简单的方法来自己创建它们:Computation Builders. 本系列是关于如何自己实现它们的一个很好的教程.F#库通常有一个bind定义的函数,可以用作计算生成器的基础,但它没有一个Choice类型(我怀疑因为有很多变体Choice).

根据您提供的示例,我怀疑F#Result<'a, 'error>类型实际上更适合您的场景.几个月前有一个用户发布计算生成器的代码审查,Either如果你想利用它,接受的答案有一个相当完整的实现.