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

Ocaml-模式匹配期间的语法错误,ocaml,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 我完全不明白怎么会在这里出现语法错误。我试着用:匹配a和b来代替乐趣,但我仍然得到相同的语法 我也试着放一些:“;”但它仍然不起作用 这些模式: Inf _ _ Inf 在

这是我的密码:

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
我完全不明白怎么会在这里出现语法错误。我试着用:匹配a和b来代替乐趣,但我仍然得到相同的语法

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

这些模式:

Inf _
_ Inf
在OCaml中没有意义。它们都由一种模式和另一种模式组成。(
Inf
模式与
Inf
构造函数相匹配,
\uu
是匹配任何内容的通配符。) 但是在OCaml中没有一个模式是由一个模式接着另一个模式组成的

这种模式也是如此:

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

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

更新

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

(P a) (P b)
(P a), (P b)
请注意,逗号是必需的。逗号是创建元组的构造函数

更新2

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

更新3

在OCaml中,使用curried函数更为惯用。我突然想到,这可能是你想要相邻图案的原因。要获取当前版本的
som
,需要使用显式的
匹配。无论是
fun
还是
function
都不够灵活

它看起来是这样的:

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