Expression de calcul n'exécute pas Let
-
23-08-2019 - |
Question
J'utilise F # v 1.9.6.2, et je l'ai défini une expression de calcul très simple:
type MaybeBuilder() =
member this.Let(x, f) =
printfn "this.Let: %A" x
this.Bind(Some x, f)
member this.Bind(x, f) =
printfn "this.Bind: %A" x
match x with
| Some(x) when x >= 0 && x <= 100 -> f(x)
| _ -> None
member this.Delay(f) = f()
member this.Return(x) = Some x
let maybe = MaybeBuilder()
Je l'ai saupoudré des déclarations d'impression dans le code pour me dire quelles méthodes sont appelées dans une expression de calcul. Quand j'exécutez l'instruction suivante:
maybe {
let x = 12
let! y = Some 11
let! z = Some 30
return x + y + z
}
Je me attends à la console pour imprimer les éléments suivants:
this.Let 12 this.Bind Some 12 this.Bind Some 11 this.Bind Some 30
Mais mes résultats réels sont les suivants:
this.Bind: Some 11 this.Bind: Some 30
En d'autres termes, F # ne semble pas exécuter l'élément Let
. Quand je ré-écrire Let
de lancer une exception, le code exécuté sans exception. De plus, lorsque je commente le membre de Let
entièrement, I ne pas obtenir un message d'erreur indiquant The field, constructor or member 'Let' is not defined
et le code est exécuté comme prévu.
(je l'ai essayé enquêter sur le code avec réflecteur, mais comme cela est généralement le cas, décompilé F # est mutilée au-delà de la lisibilité.)
On dirait que le
La solution Vous avez eu la réponse vous-même. De F # spec qui décrit comment les expressions de calcul sont traduites: Donc non, vous n'avez pas besoin de définir explicitement laisser plus, il est traduit par le compilateur. Mise à jour: ce changement est mentionné dans les notes de version détaillée du CTP Septembre. {| let binds in cexpr |}C = let binds in {| cexpr |}C)
Autres conseils
Correct -. Vous ne pouvez plus fournir une liaison pour let :(
Voir aussi http://cs.hubfs.net/forums/thread/6950.aspx