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

Était-ce utile?

La solution

Vous avez eu la réponse vous-même. De F # spec qui décrit comment les expressions de calcul sont traduites:

{| let binds in cexpr |}C  = let binds in {| cexpr |}C)

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.

Autres conseils

Correct -. Vous ne pouvez plus fournir une liaison pour let :(

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top