2016-04-01 8 views
0

Code: let ab = let a = 'a' in let b = 'B' in (Char.lowercase b) in a :: [b];;Was ist der Fehler im folgenden OCaml Snippet?

ich das let Stichwort lerne. Ich möchte den Ausdruck in die Liste der Zeichen bewerten ['a', 'b'] sondern ich erhalte den Fehler

Error: Unbound value a

Ich weiß nicht, warum dies geschieht. Soweit ich verstehe, kann ich let innerhalb let verwenden, um neue Bindungen zu erstellen, und ich habe let verwendet, um a an 'a' am Anfang selbst zu binden und daher sollte es einen gültigen Wert im inneren Bereich als auch richtig haben?

Ich weiß, dass ich einfach b = 'b' statt b = 'B' in (Char.lowercase b) tun kann, aber ich experimentiere mit was ich tun kann und was ich nicht tun kann und zu mir sollte das auch funktionieren.

+0

'a :: [b]' kann einfach geschrieben werden "[a; b] '. – ChriS

Antwort

2

Sie haben zu viele in Schlüsselwörter. Die oberste let sollte keine entsprechende in haben.

let ab = 
    let a = 'a' in 
    let b = 'B' in 
     (Char.lowercase b) in 
     a :: [b];; 

Re-schreiben Sie es wie folgt aus:

let ab = 
    let a = 'a' in 
    let b = 'B' in 
     a :: [Char.lowercase b];; 

In der Tat, da die let b Ausdruck a bezieht sich nicht, können Sie es wie folgt schreiben können:

let ab = 
    let a = 'a' 
    and b = 'B' in 
    a :: [Char.lowercase b];; 
+0

Das funktioniert, aber ich bin mir nicht sicher, ob ich verstehe, warum das Schreiben der Art, wie ich es tat, dazu führte, dass "a" unbegrenzt wurde. –

+0

Ich denke, der Fehler war irreführend. Der Fehler war 'in (Char.lowercase b) in'. Es ist fast so, als ob das zweite "in" dich zum Top-Level-Bereich gebracht hätte (wo "a" nicht mehr definiert wurde). – RichN

+0

Wenn ich das richtig verstehe, sind unsere Bindings nur bis zum Ausdruck '(Char.lowercase b)' and Dann verlieren wir alle unsere Bindungen? Wenn ja, warum hat der Compiler dann nicht den Fehler geworfen, dass "b" ebenfalls unbegrenzt ist? –

2

Based Bei Diskussion in Kommentaren würde ich auch vorschlagen, wenn Sie einen Ausdruck wünschen:

let ab = 
    let a = 'a' in 
    let b = 'B' in 
    a::[Char.lowercase b] 
in 
(* The rest of your code. *) 

Das Problem ist, dass Ihr Ausdruck war:

let ab = 
    let a = 'a' in 
    let b = 'B' in 
    Char.lowercase b (* Result: ab gets bound to 'b'. *) 
in 
a :: [b]    (* a and b aren't visible out here! *) 

ich auch in einem Stil, ähnlich wie diese Einrücken empfehlen, um Ihnen zu helfen, solche Dinge klar zu sehen. OCaml Programmierer brechen in der Regel Zeilen vor lassen. Wenn Sie die Nummern let p = e in e' und e oder e' nicht in eine Zeile passen, markieren Sie die e, aber nicht die e'. Auf diese Weise können Sie schnell erkennen, welche weiteren Ausdrücke die Bindungen von sichtbar machen, und sehen, dass alle in e gemachten Bindungen in e' nicht sichtbar sind.

+0

Das erklärt alles! Danke vielmals!! –

Verwandte Themen