例如,考虑以下表达式:
match string with
| "Foo " ^ rest -> rest
| "Bar " ^ rest -> rest
| _ -> "unmatched"
不幸的是,这是一个语法错误。有什么方法可以实现这种行为吗?
字符串的 OCaml 函数参数模式匹配中有一些解释,解释了为什么无法在模式匹配中解构字符串。您只能匹配纯字符串。
String.starts_with
(OCaml 4.13) 将字符串与固定前缀进行比较,或者使用提供正则表达式的 Str
模块,或者将字符串转换为列表并匹配那个清单。
另一种可能性是拆分进入匹配的字符串,以便您可以基于普通旧字符串的元组进行匹配。
String.(
match sub s 0 4, sub s 4 (length s - 4) with
| "foo ", rest -> ...
| "bar ", rest -> ...
| _ -> ...
)
如果您创建一个函数来根据一定数量的字符对字符串进行分区,这会变得更好看。
let part s n =
String.(sub s 0 n, sub s n (length s - n))
现在:
match part s 4 with
| "foo ", rest -> ...
| "bar ", rest -> ...
| _ -> ...
如果我们不使用模式匹配,这可能看起来像:
let (first, rest) = part s 4 in
if first = "foo " then ...
else if first = "bar " then ...
else ...