2016-10-26 12 views
0

配列の最小値を返す関数があります。パターンが配列に一致する

機能を入力しています

min : int array -> int 

その実装は次のとおりです。

let rec min a = match a with 
    | [] -> 1000000000 
    | x :: [] -> x 
    | x :: xs -> let ms = min xs in if x < ms then x else ms;; 

しかし、私はこのエラーを取得しています:

Found min with unexpected type: 
Wrong type int list -> int. 

それでは、どのように私は、パターンの配列を一致させることができます?

+1

"1000000000"はいくつかの入力で間違った結果を出すでしょう、あなたは魔法の数字を含まない方法を見つけるべきです。 – coredump

+0

あなたはそれを間違った方法でIMOにアクセスしています。配列のパターンマッチングは配列の構文で行うことができます。しかし、head :: tailパターンはありません。配列はインデックスによる直接アクセス用に作られています。必要に応じて配列をリストに変換することができます。 –

答えて

5

パターンのリスト表記を使用しているため、問題の原因となっています。配列定数は、次のようになります。あなたが期待するよう[| 3; 4; 5 |]

配列パターンは、同じになります。

let f = function 
| [| |] -> "empty" 
| [| _ |] -> "one" 
| [| _; _ |] -> "two" 
| _ -> "many" 

すべてのアレイパターンは、特定のサイズの配列と一致しました。少なくともある程度の大きさの配列は一致しません。これは、この柔軟性が利用できるリストとは対照的です。

パターンマッチングを使用するのではなく、配列を処理するより便利な方法は、Array.fold_leftまたはArray.fold_rightを使用することです。

おそらくあなたは、配列とリストが多かれ少なかれ同じ言語に慣れていることでしょう。 OCamlでは、使用するものを選択する必要があります。

4

リストとは異なり、配列は誘導的には定義されません。たとえば、リストは空のリストか、要素と別のリストのペアです。帰納的データ定義は、誘導的に、すなわち再帰的にデータを推論することができるので、優れている。配列は、同じタイプの固定量の要素として定義される非常に異なるデータ構造です。したがって、あなたのアルゴリズムは配列に対しては機能しません。そして問題は構文だけではありません。配列の誘導によって最小値を表現することはできません。たとえば、配列AのサイズがNの最小要素であるmがあり、すべてi, 0 <= i < Nの場合はm <= A(i)です。最小値を表現するには、他の方法を見つける必要があります。この定義に従うと、それを直接実装することができます。最初の要素を最小値の近似値として開始し、次の要素に進み、現在の最小値よりも小さい場合は近似値を更新します。一度すべての要素をチェックすると、最小値は目的のプロパティを満たします。

空の場合は、空の配列の最小値が未定義であると判断できます。 Thaは戻り値の型をint optionにするか、または暗黙的に例外を発生させ、その関数が空でない配列に対してのみ定義されていることを明示することで、明示的に表現できる関数を非合計にします。空の配列の最大下限はユニバースの最大値であるため(max_int)、max_intを空の配列の最小要素として返すこともできます。

+0

'max_int'に関して、これは関連しています:http://math.stackexchange.com/q/3768/131235 – coredump

関連する問題