模式匹配期间的Ocaml-语法错误

时间:2019-02-22 18:20:40

标签: ocaml

这是我的代码:

type mass    = Inf | P of int


let som = fun 
|Inf _ | _ Inf -> Inf
| (P a) (P b) -> P (a+b)

我收到以下错误:

line 5, characters 0-1:
Error: Syntax error

我根本不明白如何在这里得到语法错误。我尝试用以下方式代替乐趣:用匹配b,但我仍然得到相同的语法。

我还尝试添加一些:“;”但它仍然不起作用。

1 个答案:

答案 0 :(得分:3)

这些模式:

Inf _
_ Inf

在OCaml中没有意义。两者都由一个模式组成,然后直接由另一个模式组成。 (Inf模式与Inf构造函数匹配,而_是与任何内容匹配的通配符。) 但是,在OCaml中,没有一个模式由一个模式接着另一个模式组成。

此模式也是如此:

(P a) (P b)

如果这些模式确实有意义,那么它们似乎与功能应用程序匹配。但是模式不能拆分功能应用程序,只能拆分数据构造函数(列表,元组等)。

您希望该模式匹配的示例OCaml值是什么?

更新

您似乎在说值P 2, P 3应该与第二个模式匹配。 OCaml中的值P 2, P 3是一个元组。它将匹配此模式:

(P a), (P b)

请注意,逗号是必需的。逗号是创建元组的构造函数。

更新2

好吧,另一个错误是fun关键字仅允许一个模式。对于多种模式,您需要使用function关键字。这是函数的正确版本(假设您希望它处理mass类型的值对)。

type mass = Inf | P of int

let som = function 
|Inf, _ | _, Inf -> Inf
| (P a), (P b) -> P (a+b)

更新3

在OCaml中,具有咖喱函数的功能更为常见。令我惊讶的是,这可能就是您想要使用相邻图案的原因。要获得som的最新版本,您需要使用显式的matchfunfunction都不够灵活。

它看起来像这样:

let som x y =
    match x, y with
    | Inf, _ | _, Inf -> Inf
    | P a, P b -> P (a + b)