如何引用作为仿函数的参数
How to reference an argument that is a functor
我正在使用以下 header:
定义一个模块
module MakePuzzleSolver
(MakeCollection
: functor (Element : sig type t end) ->
(Collections.COLLECTION with type elt = Element.t))
(Puzzle : PUZZLEDESCRIPTION)
: (PUZZLESOLVER with type state = Puzzle.state
and type move = Puzzle.move) =
这是我第一次尝试使用仿函数作为参数,我有点困惑 how/whether 我可以在 MakePuzzleSolver 模块中包含对包含在仿函数的签名。例如,仿函数的签名包括一个我想引用的名为“add”的函数,但是当我尝试 MakeCollection.add
时,我当然会收到“仿函数不能有组件”的错误消息。我是否需要在 MakePuzzleSolver 中创建仿函数的实现才能引用它?
创建新型集合的仿函数本身并不是集合。
您不能引用尚不存在的模块的 add
函数。
这可能有助于确定您尝试引用此 add
函数的上下文。
您需要应用函子。与函数非常相似(这就是它的底层),您需要将函数应用于其参数才能使用其结果。
在您的示例中,您似乎错过了拼图的最后一块 - 您需要一个额外的参数来表示您的集合中的元素,例如,
module MakePuzzleSolver
(MakeCollection
: functor (Element : sig type t end) ->
(Collections.COLLECTION with type elt = Element.t))
(Puzzle : PUZZLEDESCRIPTION)
(Element : sig type t end) (* the missing element *)
: (PUZZLESOLVER with type state = Puzzle.state
and type move = Puzzle.move) = struct
module Collection = MakeCollection(Element)
(* now you can use Collection.add *)
...
end
我正在使用以下 header:
定义一个模块module MakePuzzleSolver
(MakeCollection
: functor (Element : sig type t end) ->
(Collections.COLLECTION with type elt = Element.t))
(Puzzle : PUZZLEDESCRIPTION)
: (PUZZLESOLVER with type state = Puzzle.state
and type move = Puzzle.move) =
这是我第一次尝试使用仿函数作为参数,我有点困惑 how/whether 我可以在 MakePuzzleSolver 模块中包含对包含在仿函数的签名。例如,仿函数的签名包括一个我想引用的名为“add”的函数,但是当我尝试 MakeCollection.add
时,我当然会收到“仿函数不能有组件”的错误消息。我是否需要在 MakePuzzleSolver 中创建仿函数的实现才能引用它?
创建新型集合的仿函数本身并不是集合。
您不能引用尚不存在的模块的 add
函数。
这可能有助于确定您尝试引用此 add
函数的上下文。
您需要应用函子。与函数非常相似(这就是它的底层),您需要将函数应用于其参数才能使用其结果。
在您的示例中,您似乎错过了拼图的最后一块 - 您需要一个额外的参数来表示您的集合中的元素,例如,
module MakePuzzleSolver
(MakeCollection
: functor (Element : sig type t end) ->
(Collections.COLLECTION with type elt = Element.t))
(Puzzle : PUZZLEDESCRIPTION)
(Element : sig type t end) (* the missing element *)
: (PUZZLESOLVER with type state = Puzzle.state
and type move = Puzzle.move) = struct
module Collection = MakeCollection(Element)
(* now you can use Collection.add *)
...
end