.net - 使用单例区分联合制作计算表达式

标签 .net f# pattern-matching monads computation-expression

如果我有一个尝试将起始数字相除两次的函数。整个工作流必须返回一个 bool 值。

let divideBy bottom top =
    if bottom = 0 then None
    else Some (top/bottom)

let divideByWorkflow init x y = 
    match init |> divideBy x with
    | None -> false
    | Some a -> 
        match a |> divideBy y with
        | None -> false
        | Some b -> true

let good = divideByWorkflow 12 3 2
let bad = divideByWorkflow 12 3 0

以下构建器是否正确?

type BoolMaybe = BoolMaybe with
    member __.Bind (expr, f) =
        match expr with
        | Some value -> f value
        | None -> false
    member __.Return expr = expr

let divideByWorkflow init x y =
    BoolMaybe {
        let! a = init |> divideBy x
        let! b = a |> divideBy y
        return true
    }

最佳答案

我同意 Dzoukr 的回答,我的看起来略有不同:

let divideBy bot top =
    match bot with
    | 0 -> None
    | _ -> Some (top / bot)

let divideByWorkflow init x y =
    Some init
    |> Option.bind (divBy x)
    |> Option.bind (divBy y)
    |> Option.isSome

不需要计算表达式,它在这里似乎没有增加任何好处。

关于.net - 使用单例区分联合制作计算表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43536212/

相关文章:

F# - 类型增强 VS 类型扩展

C# 枚举正则表达式匹配

haskell - Haskell 守卫/模式匹配什么时候被认为是不详尽的?

javascript - 只允许字符串中的特定字符。 Javascript

c# - 在属性上触发事件/函数? (C#)

.net - 使用领英账户登录

c# console app 按下空格键而不在屏幕上显示

c# - Distinct 不使用 LINQ to Objects

orm - F# 类型提供程序是否会为实现对象关系映射提供良好的基础?

list - 与 List 相比,F# 序列操作主要慢吗?