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的新手。
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的新手。
您的代碼有幾個問題。首先,你想要明確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);;
funli ll k-1
被解析爲(funli ll k)-1
。所以你試圖從選項中減去一個,導致你得到的錯誤。你想要的是funli ll (k-1)
。
嘗試與'funli ll(k-1)'在'x:ll'手臂。 –
另外,'k == 1'語法無效。你想'k = 1'。 '=='不用於在OCaml中測試相等性。 –
這不是無效的語法。但不推薦用於整數。 – camlspotter