仿函数中的 OCaml 语法错误

OCaml syntax error in functor

我正在尝试创建一个函子,从一个环中生成一个多项式环。我的基础类型 Ring_elt 具有以下签名:

module type Ring_elt = sig
  type t
  val add : t -> t -> t
  val mul : t -> t -> t
  val zer : t
  val one : t
  val neg : t -> t
end;;

我的多项式仿函数看起来像:

module Make_Poly2(Underlying:Ring_elt) = struct
  type t = Poly of Underlying.t list
  let rec create lst = 
    match List.rev lst with
    | Underlying.zer :: tl -> create List.rev tl
    | _                    -> Poly of lst
end;;

(所以 'create' 函数应该获取一个列表,删除前导零,然后 return 结果的多项式)。但是,我收到语法错误并且 utop 在 "Underlying."

之后加下划线 "zer"

相比之下,以下代码(用于生成整数多项式)有效:

module Make_int_poly = struct
  type t = Poly of int list
  let rec create lst = 
    match List.rev lst with
    | 0 :: tl -> create (List.rev tl)
    | _       -> Poly lst
end;;

知道发生了什么事吗?

OCaml 模式由模式匹配绑定的常量、数据构造函数和新名称构建而成。 Underlying.zer 不是那些东西。但是0就是其中之一。

似乎您可以使用 ifUnderlying.zer 进行比较。

Jeffrey 的回答很好,但与其使用 if 结构来更正它,您应该做的是:使用代数数据类型

而不是写

val zer : t
val one : t

你可以写

module type Ring_elt = sig
  type t = Zer | One | Num of t
  val add : t -> t -> t
  val mul : t -> t -> t
  val neg : t -> t
end

module Make_int_poly = struct
  type t = Poly of int list
  let rec create lst = 
    match List.rev lst with
     | Underlying.Zer :: tl -> create (List.rev tl)
     | _                    -> Poly lst
end

这是一种更好的方法,因为您可以轻松地对其进行模式匹配,甚至可以毫无问题地向您的类型添加一些常量 t