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)