这是我的代码:
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,但我仍然得到相同的语法。
我还尝试添加一些:“;”但它仍然不起作用。
答案 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
的最新版本,您需要使用显式的match
。 fun
和function
都不够灵活。
它看起来像这样:
let som x y =
match x, y with
| Inf, _ | _, Inf -> Inf
| P a, P b -> P (a + b)