Круговая зависимость - PullRequest
0 голосов
/ 29 июня 2018

Допустим, у меня есть отношение 1 -> n: у одной задачи может быть много (или ноль) заметок, а у заметки может быть ноль или одна задача. Как я могу достичь этого отношения в ReasonML? (привязка для внешней библиотеки)

Вот то, с чем я пришел в данный момент (что, конечно, не работает)

module Note = {
  module Attributes = {
    [@bs.deriving abstract]
    type t = {
      [@bs.optional]
      id: float,
      [@bs.optional]
      text: string,
      [@bs.optional]
      todo: Todo.Attributes.t,
    };
  };
};

module Todo = {
  [@bs.deriving abstract]
  type t = {
    [@bs.optional]
    id: float,
    [@bs.optional]
    title: string,
    [@bs.optional]
    completed: bool,
    [@bs.optional]
    notes: array(Note.Attributes.t),
  };
};

let todo = Todo.Attribute.t(~title="hello");

Что если Note и Todo находятся в одном файле, а в отдельных файлах?

1 Ответ

0 голосов
/ 02 июля 2018

Я не знаком с Reason, но в OCaml можно было бы делать такие вещи, используя взаимно рекурсивный модуль, как в следующем минимальном примере.

Использование взаимно рекурсивных требований определяет тип их модуля:

module type NoteSig = sig
  type t
end

module type TodoSig = sig
  type t
end

и фактические модули:

module rec Note : NoteSig = struct
  type t = {
      todo: Todo.t
    }
end

and Todo : TodoSig = struct
  type t = {
      notes: Note.t array
  }
end

Если вы предпочитаете, чтобы оба модуля были в отдельном файле, вы можете сделать почти то же самое, используя функторы (все еще используя сигнатуры модулей, скажем, в файле sig.ml ):

a.ml:

module Note (T:Sig.TodoSig) = struct
  type t = {
     todo: T.t
  }
end

b.ml:

module Todo (N:Sig.NoteSig) = struct
  type t = {
    notes: N.t array
  }
end

Теперь вы можете создавать экземпляры своих модулей в другом файле:

c.ml:

module rec NoteImpl = (A.Note(TodoImpl):NoteSig)
and TodoImpl = (B.Todo(NoteImpl):TodoSig)

Я могу только предположить, что в Reason есть способ сделать то же самое, возможно, добавив много скобок повсюду. Надеюсь, это поможет.

...