2013-02-18 40 views
0

我是Ocaml的初學者。我正在嘗試編寫一些關於正常順序縮減的代碼,並且被一些語法所困惑。以下是一些截斷代碼來隔離我的錯誤。關於Ocaml的無關

type expr = 
| Var of char 
| Num of int 
| Lambda of expr 
| Apply of expr * expr 

let rec substitute f id e = match f with 
| Num(i) -> if id == i then e else f 
| _ -> f 

let rec beta_lor e = match e with 
| Apply(Lambda(f), e2) -> substitute f 1 e2 
| Apply(e1,e2) -> beta_lor e1 
| Lambda e1 -> beta_lor e1 
| _ -> None 

在.mli我要求的beta_lor應類型的文件: VAL beta_lor:EXPR - > EXPR選項

現在,當我編譯此文件時,它會報告關於行「無差錯「我在beta_lor使用: 錯誤:這個表達式「一個選項 但預計表達式類型expr的

據我所知,ocaml的編譯器試圖做類型推斷,並希望我輸出一個表達式,而比'一個選項,但我聲稱beta_lor可能會輸出選項?我有些困惑,請幫忙。

回答

1

您的問題是substitute不是返回expr option。它只是返回expr。也許你想要的是beta_lor返回Some (substitute f 1 e2)這種情況。

編輯

對於它的價值,你的描述似乎是基於這樣的想法,一個選項類型,就像是一個主流語言的指針類型,可以是一個有趣的指針或NULL。這更有啓發性(在我看來)關注這樣一個事實,即有兩種情況:Some表達式None。你需要在OCaml中明確地打包和展開這兩種情況,這在我看來是比將NULL視爲合法指針值更好的。我們每天都會看到我們身邊的主流模式的缺點(遺憾編輯)。

+0

好的,現在感謝它編譯。但是我很困惑ocaml編譯器在這種情況下如何工作用於類型推斷,它是如何掃描匹配的情況並試圖推導出輸出類型應該是expr(替代的輸出)還是None?或者,它只是看第一個案例,並推斷輸出應該是expr? – 2013-02-18 17:35:35

+1

它看着*所有*,並確保它們是相同的(根據需要統一類型)。在我看來,最令人困惑的是錯誤信息! 「預期」和「看到」類型之間的區別並沒有特別明確。對我來說,通常會更清楚地認爲它是一種普遍的類型衝突(不同的類型應該是相同的)。 – 2013-02-18 17:44:49

+0

好的,這是有道理的,所以如果我寫一些(替代f 1 e2),它將「expr選項」類型與「'選項」類型統一起來。這意味着它不能統一「expr」和「'a option」,但是這種情況是否應該自然地被看作是「expr選項」?我錯過了什麼嗎? – 2013-02-18 17:51:00