2016-11-01 8 views
0

パターンマッチングについて学ぶために、私は現在Ocamlの1から3までの数字を生成してstdoutに書き込もうとしています。乱数ジェネレータとパターンマッチング - OCaml

これは私がこれまでに書いたもの(空の引数を持つ関数)である:

let random_compchoice() = match Random.int 3 with 
    | 1 -> "1" 
    | 2 -> "2" 
    | 3 -> "3" 
    | _ -> "Error" 
;; 

Printf.printf "The option is %s\n" random_compchoice;; 

は、しかし、これはトリガー:

**Error**: This expression has type unit -> string 
     but an expression was expected of type string 

しかし、私はこれを行う場合:

let random_compchoice = match Random.int 3 with 
    | 1 -> "1" 
    | 2 -> "2" 
    | 3 -> "3" 
    | _ -> "Error" 
;; 

Printf.printf "The option is %s\n" random_compchoice;; 

をこれはコンパイルされますが、デフォルトは常に

The option is Error 

私はそこに行方不明の何かのアイデア?前もって感謝します。 (最初の 'case'として1で始まり、0ではないことも確かではありません)。あなたの最初の例で

+1

最後の質問に答えるために、任意のパターンを設定することができます。彼らはどこにいても実際には「始まっていない」。 OCamlはパターンがすべての可能なケースをカバーしていないかどうか警告します。一方、 'Random.int 3'は0,1、または2を返します。 –

+0

...マッチを網羅するために洗練されたタイプが必要なので、それまではcatch-allが必要です。 – nlucaroni

答えて

4

、あなたは、2つの理由がありますが、実際には、unit引数と第二のサンプルは常に失敗した理由を

Printf.printf "The option is %s\n" @@ random_compchoice();; 

を関数を呼び出す必要があります。それは常には失敗なぜあなたは(少なくとも)と乱数ジェネレータを初期化していないので、これを行わない場合は、各実行の乱数の同じストリームを取得します

Random.self_init() 

、ありますこの場合、0である。さらに、the random number generator of integers is from 0 (inclusive) ... n (exclusive)。生成された乱数に1つだけ追加することができます。

... = match 1 + Random.int 3 with ... 
関連する問題