如何引用作为仿函数的参数

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