4

エラーが発生する Ocaml 関数があります。

私がやろうとしていること:

サイズ「制限」の乱数 (0-2) のリストを再帰的に作成します。

ここに私が持っているものがあります:

let rec carDoorNumbers = fun limit -> 
match limit with
| [1] -> Random.int 3
| [] -> Random.int 3 :: carDoorNumbers (limit-1);;

このエラーが発生しています:

Error: This expression has type 'a list
   but an expression was expected of type int
4

2 に答える 2

3

関数が何をしなければならないかを考えてみてください: 制限が与えられた場合、数値のリストを作成する必要があります。だからあなたのタイプはのようなものcarDoorNumbers : int -> int listです。

それを見ると、2つのエラーがあるようです。まず、リスト パターンに対してlimit(これは である必要があります) を照合しています。要素のみを含むリストと一致し、空のリストと一致します。あなたは本当に数字と他の数字と照合したい.int[1] -> ...1[]1n

match2 つ目のエラーは、ステートメントで 2 つの異なる型を返すことです。リストを返すことになっていることに注意してください。Random.int 3最初のケースでは、intではなくを返していint listます。ここで本当に返したいのは のようなものです[Random.int 3]

あなたが得たエラーは少し混乱しています。最初に返されたものは だったのでint、2 番目のものであると予想されますint。ただし、2 番目のケースは実際には正しかっですint list。ただし、コンパイラはあなたの意図を理解していないため、エラーは逆です。int listを に変更するのではなく、を に変更するint必要があります。intint list

于 2012-09-26T21:11:09.190 に答える
2

式はlimitmatchをリストのように扱います。[1]とはどちら[]もリストです。それがコンパイラがあなたに言っていることです。しかし、制限は整数でなければならないようです。

整数に一致させるには、整数定数を使用してください。角括弧はありません。

(余談ですが、0 を渡したときに関数が正常に動作することを確認したい場合があります。)

于 2012-09-26T21:11:06.710 に答える