2016-11-26 2 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を期待するために理由を見ていない「オプションを入力しているが、式はint型ocamlコードの問題点は何ですか?

に期待されました。このコードで何が起こっているのか理解してください。私はOCamlを初めて使っています。

+0

'x:ll'アームで' funli ll(k-1) 'と試してみてください。 –

+1

また、 'k == 1'は無効な構文です。 'k = 1'が欲しい。 '=='はOCamlでの等価性のテストには使用されません。 –

+0

無効な構文ではありません。しかし、整数にはお勧めできません。 – camlspotter

答えて

1

コードにはいくつか問題があります。まず、k-1がパラメータであり、OCamlがその腕をどのように解釈しているのかを(funli ll k)-1に戻そうとしていないことを明示したいとします。さらに、==は、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として解析されます。だからあなたはオプションから1つを減算しようとしています、あなたが持っているエラーにつながる。

ほしいものはfunli ll (k-1)です。

関連する問題