Полиморфный тип внутри модуля (OCaml) - PullRequest
5 голосов
/ 15 января 2012

Я просто определяю модуль Matrix следующим образом:

module Matrix =
  struct
    type element
    type t = element array array

    let make (nr: int) (nc: int) (init: element) : t =
      let result = Array.make nr (Array.make nc init) in
      for i = 0 to nr - 1 do
        result.(i) <- Array.make nc init
      done;
      result
  end

И let m = Matrix.make 3 4 0 выдает ошибку Error: This expression has type int but an expression was expected of type Matrix.element.Затем я добавил 'a:

module Matrix =
  struct
    type element = 'a
    type t = element array array

    let make (nr: int) (nc: int) (init: element) : t =
      let result = Array.make nr (Array.make nc init) in
      for i = 0 to nr - 1 do
        result.(i) <- Array.make nc init
      done;
      result
  end

Компиляция модуля выдает ошибку Error: Unbound type parameter 'a.

Может кто-нибудь сказать мне, как определить тип внутри моего модуля?

1 Ответ

5 голосов
/ 15 января 2012

Две проблемы: (1) переменные типа не могут быть названы привязкой, как вы пытались с element, и (2) ваш тип t должен иметь все переменные типа в качестве параметров, если предполагается, что он полиморфный,То есть вы либо хотите написать

type 'a t = 'a array array

, либо вам нужно превратить модуль в функтор, где вы берете element в качестве параметра всего модуля.

...