2017-04-24 14 views
2

マージソートプログラムを再実行するときに、関数内にmatch withステートメントを実装しました。 'chunkA'は、関数のパラメータの中に明記されていたことから、関数パラメータの名前空間またはモジュール 'XXXXX'が定義されていません

The namespace or module 'chunkA' is not defined. 

これは紛らわしいです:

let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i = 
    match a, b with 
    | chunkA.Length, _ -> chunkB 
    | _, chunkB.Length -> chunkA 
    | _ when chunkB.[b] < chunkA.[a] 
     -> array.[i] <- chunkB.[b] 
      merge array chunkA chunkB a (b+1) (i+1) 
    | _ -> array.[i] <- chunkA.[a] 
      merge array chunkA chunkB (a+1) b (i+1) 

ただし、Visual Studioはエラーを投げました。

さらに、私はF#と関数型プログラミング一般にかなり新しいです。私のコード内の構造や方法論が同程度でない場合は、この点についてもお気軽にコメントしてください。

また、厚くなっている場合は、私にもそのことを教えてください。あなたは試合を使用する場合

多くのおかげで、ルーク

答えて

2

、あなたは時定数をコンパイル使用する必要があります。このような

何かがジョンが述べたように、あなたが直接、パターン別の変数に対して数値と一致することはできませんあなたが望む

|aa,_ when aa=chunkA.Length -> .... 
3

です。パターンの言語は、定数、コンストラクタ、その他いくつかのものだけを許します。

あなたはwhenを使用してコードを書くことができますが、あなたが唯一のwhen句で条件を持っているので、あなたは本当に、どのような方法でmatch constrctの恩恵を受けません。それはあなたが何をしているか、それがより明確になるので、その場合は、私は、昔ながらのifのために行くだろう:

let rec merge (array : int[]) (chunkA : int[]) (chunkB : int[]) a b i = 
    if a = chunkA.Length then chunkB 
    elif b = chunkB.Length then chunkA 
    elif chunkB.[b] < chunkA.[a] then 
     array.[i] <- chunkB.[b] 
     merge array chunkA chunkB a (b+1) (i+1) 
    else 
     array.[i] <- chunkA.[a] 
     merge array chunkA chunkB (a+1) b (i+1) 

あなたがパターンより機能的なデータ構造に一致している場合match構築物は非常に便利です - 例えば2つのリスト(配列ではなく)にmergeと書いていたら、パターンマッチングでもっとうまくいくでしょう。

関連する問題