3

以下で説明するモジュールの目的は、整数nによって開始されると、nの値に基づいてすべての操作を実行するモジュールを実装することです。

module ReturnSetZero =
functor ( Elt : int ) ->
    struct
        let rec sublist b e l =
               match l with
           [] -> failwith "sublist"
          | h :: t ->
              let tail = if e = 0 then [] else sublist (b - 1) (e - 1) t in
                    if b > 0 then tail else h :: tail
        let rec zerol = 0:: zerol
        let zeron = sublist 0 n zerol
                (*other operations based on n which is selected once when the module is initialized*)
    end;;

エラー:バインドされていないモジュールタイプint

ここでの問題は何ですか?より効果的/直感的な代替実装はありますか?

4

1 に答える 1

2

ファンクターはモジュールをモジュールにマップします。整数はモジュールではないため、ファンクターパラメーターとして使用することはできません。

モジュールタイプを定義する必要があります。

module type WITH_INTEGER = sig
  val integer : int
end

module PrintInteger = 
  functor (Int:WITH_INTEGER) -> struct

  let print_my_integer () = print_int Int.integer

終わり

もちろん、モジュールが整数の値に依存する型を公開する必要がない限り(または、その整数に依存する多くの値を公開する必要がある場合)、その整数を次のように受け取る単純な関数を使用した方がよいでしょう。引数:

let my_function integer = 
  let data = complex_precomputations integer in 
  function arg -> do_something_with arg data

これにより、整数に対して(関数に渡すときに)複雑な事前計算を1回だけ実行できます。

于 2010-10-28T10:54:33.903 に答える