字符串上的模式匹配

时间:2014-09-18 06:02:45

标签: ocaml

说我有以下类型定义:

type e = AES | DES | SALSA20

然后,我有一个函数,其参数为类型字符串,该参数可以是“AES”,“DES”,“SALSA20”或其他内容。我怎么能先把这个字符串转换成一个类型,然后将这个类型与可能的类型相匹配?或者,是否有必要因为有人可能认为你可以直接匹配一个字符串,如下所示?

match str with
| "AES" -> do something...
| "DES" -> do something else...

如果可能的话,我是否还可以获得关于字符串模式匹配如何工作的基本介绍?我觉得直接字符串匹配会慢得多......

2 个答案:

答案 0 :(得分:2)

您可以编写如下函数:

let e_of_string = function
| "AES" -> AES
| "DES" -> DES
| "SALSA20" -> SALSA20
| _ -> raise (Invalid_argument "e_of_string")

我检查了OCaml 4.01.0生成的本机代码;它按顺序将提供的字符串与每个给定字符串进行比较。如果有很多字符串要检查,正如你所说,这很慢。

要获得更强大的字符串匹配,您可以使用Str模块中的正则表达式,也可以使用ocamllex。

答案 1 :(得分:1)

你可以这样做。如果要执行多个匹配,则首先将字符串映射到数据类型非常有意义。对于一次匹配,我会选择最直接的代码(或者最一致的,如果这是在代码库中的其他地方完成的事情)。

映射到类型可能类似于:

type thing = AES | DES | SALSA20

let thing_of_string = function
  | "AES" -> AES
  | "DES" -> DES
  | "SALSA20" -> SALSA20
  | _ -> failwith "not a thing"

字符串匹配最近得到了改进,并且应该具有可接受的效率。我仍然会避免多次执行相同的字符串匹配。