2016-05-01 3 views
1

各文字がアルファベットの大文字であるタイプ(char、 'list)リストのリストを作成したいと思います。私はget_listの2番目のマッチの場合、警告をWarning 11: this match case is unused.にしています。私は最初のケースでいくつかのプリントを行い、lenが値0で取得されていることを発見したので、2番目のケースは使用しません。何が起こっていますか?OCamlで使用されない大文字小文字の区別

let rec get_list abc i len = 
    match i with 
    | len -> [] 
    | _ -> ((String.get abc i), [])::get_list abc (i + 1) len 

in 

let rec print_list l = 
    match l with 
    | [] ->() 
    | h::t -> print_char(fst h);print_list t 
in 

let abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" in 
let abc_l = get_list abc 0 (String.length abc) in 
print_list abc_l;; 
+0

私はそれから...それ以外... '場合を使用したいです...'式の代わりに整数を使用しています。これは、読者の感覚をはるかに速く、エラーを起こしにくいものにします。 –

答えて

0

あなたのパターンのlenはパターンによって導入された新しい変数です。パターンとして、その意味は何にもマッチするということです。したがって、次のパターン_は決して一致しません。

@AlexanderRevyakinによれば、この新しい変数lenは、lenという名前のパラメータを隠しています。

パターン内のlenがパラメータlenの値を表す場合。 OCamlパターンには、(一致する値の部分がバインドされる)新しい変数と定数だけが含まれます。実行時に評価される式は含まれません。そのためには、if/then/else(@AntonTrunovが指摘しているように)を使用します。

0

あなたは

match i with 
    | len -> [] 
    | _ -> ["..."] 

lenを書くとき、それは

動作しない理由はlenは、上記の定義を行うにはない何かを持っている一般的なパターンです。変数がどのように見えるかだけを定義するパターンマッチングでは、一般的な "構造"と記述し、変数名はパターンマッチングの異なる部分に名前を付けるために使用され、新しい変数です。あなたが行うことができますリストを持つたとえば:あなたは「_」置くとき

match my_list with 
    | [x,y,z] -> x+y+z 
    | x :: r -> x + (List.length r) 
    | anything_else -> List.length anything_else 

は、それは「私はそれがその値は気にしない、私はそれを必要としない」と言うための唯一の大会です。ここではタプルを持つ別の例である:

match my_tuple with 
    | (a,b) -> a+b 

ソリューション:あなたはwhenキーワードを使用することができますパターンマッチングで条件を入れたい場合は

をマッチングconditionnalパターン:

match i with 
    | n when n = len -> [] 
    | _ -> ["..."] 

もう一つの例その "並べ替え" のタプル:

match my_tuple with 
    | (a,b) when a>b -> (a,b) 
    | (a,b)   -> (b,a) 

それとも、整数での使用条件:

if i = len then [] 
else ["..."] 

また、あなたは関数内でパターンマッチングを行うことができますことに注意することができます

let f (a,b) = a+b