我是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可能會輸出選項?我有些困惑,請幫忙。
好的,現在感謝它編譯。但是我很困惑ocaml編譯器在這種情況下如何工作用於類型推斷,它是如何掃描匹配的情況並試圖推導出輸出類型應該是expr(替代的輸出)還是None?或者,它只是看第一個案例,並推斷輸出應該是expr? – 2013-02-18 17:35:35
它看着*所有*,並確保它們是相同的(根據需要統一類型)。在我看來,最令人困惑的是錯誤信息! 「預期」和「看到」類型之間的區別並沒有特別明確。對我來說,通常會更清楚地認爲它是一種普遍的類型衝突(不同的類型應該是相同的)。 – 2013-02-18 17:44:49
好的,這是有道理的,所以如果我寫一些(替代f 1 e2),它將「expr選項」類型與「'選項」類型統一起來。這意味着它不能統一「expr」和「'a option」,但是這種情況是否應該自然地被看作是「expr選項」?我錯過了什麼嗎? – 2013-02-18 17:51:00