首页 > 解决方案 > Choice<'T1,'T2> 上的一元操作

问题描述

我在标准库中找不到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)
    }

就像在 Haskell 中一样。我是否遗漏了什么,或者是否有第三方库可以编写这类东西,或者我必须重新发明这个轮子?

标签: f#computation-expression

解决方案


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

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


推荐阅读