仿函数中的 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
就是其中之一。
似乎您可以使用 if
与 Underlying.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
。
我正在尝试创建一个函子,从一个环中生成一个多项式环。我的基础类型 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
就是其中之一。
似乎您可以使用 if
与 Underlying.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
。