循环依赖原因
Circular dependency reasonml
假设我有一个 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 在一个文件中,一个在不同的文件中怎么办?
我不熟悉 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
如果你希望两个模块都在一个单独的文件中,你可以使用 functors 做几乎相同的事情(仍然使用模块签名,假设在一个文件中 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 中做同样的事情,可能是通过在各处添加很多括号。希望对你有帮助。
假设我有一个 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 在一个文件中,一个在不同的文件中怎么办?
我不熟悉 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
如果你希望两个模块都在一个单独的文件中,你可以使用 functors 做几乎相同的事情(仍然使用模块签名,假设在一个文件中 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 中做同样的事情,可能是通过在各处添加很多括号。希望对你有帮助。