2017-08-08 11 views
1

私はocaml_pluginを使用して、実行時にOCaml式を評価できる電卓を作成しています。OCamlプラグインの任意の型のインターフェイス

これは私のプラグインインターフェイスです。

open Ocaml_plugin.Std 

module type S = sig 
    val f : unit -> float 
end 

let univ_constr : (module S) Ocaml_dynloader.Univ_constr.t = 
    Ocaml_dynloader.Univ_constr.create() 

Iは、関数本体における発現を評価するためのメインプログラムで)、例えば、署名unit -> float

let f() = 3.14159 
let f() = 1.5 *. 1.5 *. 3. 

の機能を読み込むと、(fを呼び出すことができています。ただし、フロートタイプのみサポートしています。

intをサポートしたい場合はどうすればよいですか? Time.t? Pervasiveの任意のOCaml型ですか?

let f() = List.length [1;2;3] (* int *) 
let f() = Time.now()   (* Time.t *) 
let f() = "hello world!!!"  (* string *) 

実行時に評価するために、ocaml_pluginが唯一の方法です。しかし、ローダ/コンパイラに動的にロードされるものを知らせるためには、インタフェースを記述する必要があります。他のタイプをサポートするようにインタフェースファイルをどのように変更する必要がありますか?

+1

なぜ任意のタイプですか?確かにあなたのメインプログラムの 'f'は期待される結果の型を持っていますか? – Bergi

+0

計算結果が表示されます。パーベイシブのすべてのタイプを文字列として出力できます。 –

+0

GADTは、いくつかのタイプのサポートを追加する方法です。 –

答えて

2

救助するGADT(一般化された代数データ型)。

GADTは長い間存在していますが、OCamlでは比較的新しいトピックです。これは、OCamlで汎用ライブラリを安全に書くのに大いに役立ちます。

module Value = struct 
    type 'a t 

    module Packed = struct 
    type 'a unpacked = 'a t 
    type t = T : 'a unpacked -> t 
    end 

end 

Value.Packed.tは、必要なパックデータ型です。理論的には任意のデータ型'aをパックすることができます。

関連する問題