Пример вложенных подписей в OCaml? - PullRequest
5 голосов
/ 07 декабря 2010

В OCaml вы можете вкладывать подписи:

module type FOO =
sig
  module type BAR
  (* … *)
end

Мне просто интересно, есть ли у кого-нибудь примеры такого использования, поскольку я не могу придумать места, где это понадобится. Я думаю, что это, вероятно, полезно для обратных подписей функторов, но я не могу думать ни о каких конкретных вещах.

Ответы [ 2 ]

5 голосов
/ 07 декабря 2010

Я помню, что видел несколько модулей (возможно, в батарейках), которые включали модуль Infix внутри, который можно было открывать отдельно и только тогда, когда это действительно необходимо. Например,

module Rational = 
  struct
    let add a b = ...
    let sub a b = ...

    module Infix =
      struct
        let (<+>) = add
        let (<->) = sub
      end
  end

Таким образом, если бы вы открыли модуль Rational.Infix, вы не удалили бы (?) Функции с такими же именами, как в Rational.

Я работаю над проектом, в котором мы используем модули для разграничения types. Наличие модуля, определяющего только один тип, и управление этим типом помогает в организации; особенно если модули маленькие и иметь отдельный файл нецелесообразно, а варианты типов не имеют смысла.

module Node = 
  struct 

  end
module Edge = 
  struct

  end

type 'a tree = { nodes : 'a Node.t; edges : 'a Edge.t; }

Мы также используем их, хотя и в виде отдельных файлов (в сочетании с -mlpack), для всех анализаторов, которые нам нужны для биологических данных - Nexus, Fasta, Phylip и так далее.

Наконец, часто при создании прототипа нового алгоритма мы сначала пишем его в ocaml, а затем работаем над версией C. Мы обычно храним версию ocaml во внутреннем модуле с теми же именами функций.

module Align = 
  struct
    module OCaml = 
      struct

      end
  end
4 голосов
/ 07 декабря 2010

Первый пример, который мне пришел в голову: http://caml.inria.fr/pub/docs/manual-ocaml/libref/type_Map.html

(это действительно подпись функтора)

...