2016-04-01 4 views
0

コード: let ab = let a = 'a' in let b = 'B' in (Char.lowercase b) in a :: [b];;次のOCaml Snippetのエラーは何ですか?

私はletキーワードを学んでいます。私は式が文字のリストに評価したい['a', 'b']ではなく、私はエラーなぜこれが起こっている私にはわからない

Error: Unbound value a

を得続けます。私が理解するところでは、letletの中に新しいバインディングを作成するために使用し続けることができます。a'a'にバインドするためにletを使用しました。そのため、内部スコープにも有効な値が必要ですか?

私は単にの代わりにb = 'b'を行うことができますが、私はできることとできないことを試しているし、私にもこれはうまくいくはずです。

+0

'a :: [b]'は簡単に '[a; b]。 – ChriS

答えて

2

in個のキーワードが多すぎます。最上位のletには対応するinが含まれていてはなりません。

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

このようにそれを再書き込み:実際には

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

let b式はaを参照していないので、あなたはこのようにそれを書き込むことができます。

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

それはうまくいきますが、なぜ私が「a」に無限になるように書いたのかを理解しているかどうかはわかりません。 –

+0

私はこの誤りが間違っていると思います。間違いは「in(Char.lowercase b)in」であった。 2番目の 'in'のようにトップレベルのスコープ(' a'はもはや定義されていません)に移動しました。 – RichN

+0

私が正しく理解していれば、私たちのバインディングは式 '(Char.lowercase b)'と '私たちはすべての縛りを失いますか?もしそうなら、なぜコンパイラは 'b'も無制限であるというエラーを投げなかったでしょうか? –

2

ベースコメントでの議論では、式を欲しければ、私もお勧めします:

私はまた、あなたが明確なものを見るのを助けるために、この1に似たスタイルでインデントをお勧めします

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! *) 

問題は、あなたの表現がこのだったということです。 OCamlのプログラマは通常、letの前に行を分割します。 let p = e in e'eまたはe'が1行に収まらない場合は、eはインデントしますが、e'はインデントしません。こうすれば、pのバインディングが表示されている式をすぐに確認できます。eのバインディングはe'に表示されません。

+0

それはすべてを説明する!どうもありがとう!! –