2017-02-21 16 views
1

スカラー値(例えば、整数または文字列)を実際の値または何らかのNA値で表現し、後でそれらを コレクション(例えばリスト)に格納したいとします。目的は、欠損値を処理することです。これを行うにはOCaml複数の型を持つシグネチャ

は、私は今、私はScalar Sが含まれて心の中でいくつかの多型Vectorタイプを持って署名

module type Scalar = sig 
    type t 
    type v = Value of t | NA 
end 

を実装しています。基本的には次のうちのいくつか

module Make_vector(S: Scalar) = struct 
    type t = S.v list 

    ... rest of the functor ... 
end 

しかし、私はこれを動作させることはできません。

module Int_vector = Make_vector(
    struct 
     type t = int 
    end 
) 

module Str_vector = Make_vector(
    struct 
     type t = string 
    end 
) 

... and so on for some types. 

私はまだOCamlとはあまり働いていないので、これは正しい方法ではないかもしれません。どのようにsum型の多相スカラを実現するかについてアドバイスしていますか?

コンパイラは、常に次のようなメッセージで応答する前に

The parameter cannot be eliminated in the result type. 
Please bind the argument to a module identifier. 

、私は、和型としてScalarを実装しようとしましたが、原因巨大なmatch条項にいくつかの機能を実現する際 複雑さの問題に遭遇してきました。もう1つのオプションはoptionです。これはより良い戦略ですか?

答えて

0

私が見る限り、ファンクタの入力タイプとしてvを構成していますが、実際に出力タイプにしたいと考えています。ファンクタを適用すると、タイプtのみが提供されますが、vは提供されません。私の提案はMake_vectorの実装にvの定義を移すことです。

+0

これについては考えていません。今それは動作します。ありがとう:) – teekay

0

モジュール/ファンクタを使って正確に何をしようとしていますか?なぜ簡単な'a option listは十分ではありませんか?あなたはその上で動作する機能を持つことができます。

let rec count_missing ?acc:(acc=0) = function 
    | None::tail -> count_missing ~acc:(acc+1) tail 
    | _::tail -> count_missing ~acc tail 
    | [] -> acc ;; 


val count_missing : ?acc:int -> 'a option list -> int = <fun> 

count_missing [None; Some 1; None; Some 2] ;; 
- : int = 2 

count_missing [Some "foo"; None; Some "bar"] ;; 
- : int = 1 
関連する問題