首页 > 解决方案 > 模式匹配期间的 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

我完全不明白如何在这里得到语法错误。我试图用 : match ab 替换乐趣,但我仍然得到相同的语法。

我也试着放一些:“;” 但它仍然不起作用。

标签: ocaml

解决方案


这些模式:

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关键字。这是您的函数的正确版本(假设您希望它处理 type 的值对mass)。

type mass = Inf | P of int

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

更新 3

在 OCaml 中,具有柯里化函数更为惯用。令我震惊的是,这可能是您想要拥有相邻模式的原因。要获得咖喱版本,som您需要使用明确的match. 也fun不够function灵活。

它看起来像这样:

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

推荐阅读