2016-04-01 44 views
0

代碼: let ab = let a = 'a' in let b = 'B' in (Char.lowercase b) in a :: [b];;以下OCaml代碼段中的錯誤是什麼?

我學習了let關鍵字。我想表達的評估,以人物的名單['a', 'b']而是我不斷收到錯誤

Error: Unbound value a

我不知道爲什麼會這樣。據我所知,我可以繼續使用letlet內創建新的綁定,我已經使用let綁定a'a'開始本身,因此它應該有一個在內部範圍內的有效值以及?

我知道我可以簡單地做b = 'b'而不是b = 'B' in (Char.lowercase 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'。這幾乎就像第二個'in'把你帶到頂級範圍(其中'a'不再被定義) – RichN

+0

如果我理解正確,我們的綁定是否僅在表達式'(Char.lowercase b)'和那麼我們失去了我們所有的綁定?如果是這樣,那麼編譯器爲什麼沒有拋出「b」也是無界的錯誤? –

2

基礎的在評論的討論中,我還建議,如果你想要一個表達式:

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

的問題是,你的表情是這樣的:

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 p = e in e'ee'不適合在一行上,請縮進e,而不是e'。這樣,您可以快速查看p的綁定可見的更多表達式,並看到e中的任何綁定在e'中都不可見。

+0

這就解釋了一切!非常感謝!! –