2012-01-14 33 views
2

長さ、幅、サイズ、read_element、write_elementなどの一般的な操作を含む一般的な行列モジュールを作成したいと考えています。行列はいくつかの型で定義することができます:element array arrayelement list listまたはmapである場合、このモジュールの利点は、内部の行列のタイプの詳細を処理し、モジュールが呼び出されるレベルを気にしないことです。OCamlで行列モジュールを定義する

module type A_TYPE = 
    sig 
    type t 
    end;; 

module matrix = 
    functor (Elt: A_TYPE) 
    struct 
    type element = Elt.t 
    type t = element array array 
     (* `element list list` if I want a matrix to be a list of a list *) 

    let length (m: t) : int = 
     Array.length a 
     (* `List.length a` if t = element list list *) 

    ... ... 

    end 

をだから、外部から、1を書くことができます:現時点では、私は次のように何かを考える

module MyInt = struct type t = int end 
module MatInt = Matrix(MyInt) 
module MyFloat = struct type t = float end 
module MatFloat = Matrix(MyFloat) 

let m = MatInt.make 3 4 0 
let n = MatFloat.make 3 4 0.2 

私の質問は以下のとおりです。

1)私は最初のモジュールを定義する必要がMyIntをファンクタに入れてMatIntを作成してください...冗長になっています...タイプがintの行列モジュールを直接インスタンス化する方法はありますか?

2)(* ... *)に書かれている内容を考慮して、マトリクスモジュールを実装する方法はありますか?同時に、マトリクスのタイプのさまざまな可能性を同時に処理する方法がありますか?多分パターンマッチングで?

私の質問は明確ですが、誰でも手伝ってもらえますか?質問#1については

+0

をあなたは車輪の再発明ているように私は感じます。 Polkaを見てくださいhttp://pop-art.inrialpes.fr/~bjeannet/newpolka/html/polka_72.html#SEC97 – pad

+0

@pad:この[質問](http:// stackoverflow。 com/questions/8865283/using-matrix-module-of-polka-in-ocaml)?ありがとう – SoftTimur

+0

申し訳ありませんが、私はポルカを使用しません。モジュールの署名が要件に完全に一致するため、ここで言及します。 – pad

答えて

1

:あなたはミンモジュールを定義する必要はありません、あなたが実行してそのステップを切り取ることができます:

module MatInt = Matrix(struct type t = int end) 
関連する問題