2016-11-26 43 views
0
let rec funli li k = match li with 
| [x] -> if k==1 then Some(x) else None 
| x::ll -> funli ll k-1;; 

UTOP顯示 錯誤:此表達式的類型爲「一個選項,但預計表達式類型爲int下面的ocaml代碼有什麼問題?

的我認爲沒有理由爲它期待int。請幫助我瞭解此代碼中發生的事情。我是OCaml的新手。

+0

嘗試與'funli ll(k-1)'在'x:ll'手臂。 –

+1

另外,'k == 1'語法無效。你想'k = 1'。 '=='不用於在OCaml中測試相等性。 –

+0

這不是無效的語法。但不推薦用於整數。 – camlspotter

回答

1

您的代碼有幾個問題。首先,你想要明確k-1是一個參數,並且你不想返回(funli ll k)-1,OCaml正在將該臂解釋爲。此外,==不用於測試OCaml中的相等性。這將工作正常

let rec funli li k = match li with 
| [x] -> if k=1 then Some(x) else None 
| x::ll -> funli ll (k-1);; 
0

funli ll k-1被解析爲(funli ll k)-1。所以你試圖從選項中減去一個,導致你得到的錯誤。你想要的是funli ll (k-1)