Si j'ai une fonction qui tente de diviser un nombre de départ deux fois. L'ensemble du flux de travail doit renvoyer un booléen.
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
Le constructeur suivant est-il correct?
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
}
3 réponses
Je suis d'accord avec la réponse de Dzoukr, la mienne est légèrement différente:
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
Aucune expression de calcul requise, cela ne semble pas apporter d'avantages ici.
IMHO il n'y a aucune raison de le rendre plus complexe en utilisant l'expression de calcul. Je préférerais rester avec quelques fonctions simples comme:
let divideBy bottom top =
if bottom = 0 then None
else Some (top/bottom)
let divideByTwoTimes init x y =
init |> divideBy x |> Option.bind (divideBy y)
let divideByWorkflow init x = divideByTwoTimes init x >> Option.isSome
Cela fonctionne, mais je pense que c'est inutilement spécifique. Si vous voulez utiliser un CE, je préfère définir un CE normal Maybe
puis faire
let divideByWorkflow init x y =
Maybe {
let! a = init |> divideBy x
let! b = a |> divideBy y
return true
}
|> Option.defaultValue false
De nouvelles questions
.net
N'utilisez PAS pour les questions sur .NET Core - utilisez plutôt [.net-core]. Le framework .NET est un framework logiciel conçu principalement pour le système d'exploitation Microsoft Windows. Il comprend une implémentation de la bibliothèque de classes de base, du Common Language Runtime (communément appelé CLR), du Common Type System (communément appelé CTS) et du Dynamic Language Runtime. Il prend en charge de nombreux langages de programmation, notamment C #, VB.NET, F # et C ++ / CLI.