OCaml将一个字符串映射为一个字符串列表

5
我将尝试在OCaml中创建一个将字符串映射到字符串列表的字典。我已经参考了这个基本的字符串到字符串映射教程,但我需要一些帮助来制作列表。
以下是我在Python中想要实现的内容:
>>> food = {}
>>> food["fruit"] = ("blueberry", "strawberry", "kiwi")
>>> food["veggie"] = ("broccoli", "kale")
>>> for k in food:
...     for v in food[k]:
...         print k, "-->",v
...
fruit --> blueberry
fruit --> strawberry
fruit --> kiwi
veggie --> broccoli
veggie --> kale

感谢您的提前帮助。
2个回答

5
您可以使用列表。
let food = [
  "fruit",  ["blueberry"; "strawberry"; "kiwi"];
  "veggie", ["broccoli"; "kale"]
]

并使用List.assoc来访问它:

List.assoc "fruit" food

将评估为
- : string list = ["blueberry"; "strawberry"; "kiwi"]

如果您需要具有对数搜索功能的真实地图,则可以使用Map模块。在标准库中,它提供了一个函数对象Make,可以为用户提供的数据创建地图,例如:
module Strings = Map.Make(String)

将创建一个名为Strings的模块,它是从string类型到任何其他类型的映射。 您可以轻松地将列表用作值类型:

let map = Strings.empty 
Strings.add "fruit" ["blueberry"; "strawberry"; "kiwi"] map

当然,这将创建一个持久化的映射。如果你需要一个可变的映射,就像Python中的那样,那么你需要使用Hashtbl模块。
下面是一个使用Hashtbl的示例:
let food = Hashtbl.create 16
Hashtbl.add food "fruit" ["blueberry"; "strawberry"; "kiwi"]
Hashtbl.add food "veggie" ["broccoli"; "kale"]
Hashtbl.find food "veggie"

将被评估为

- : string list = ["broccoli"; "kale"]

2

在OCaml中,数组和列表并不相同。我假设您想使用列表(如标题所示),而不是数组(如问题正文中所述)。

以下是教程中略微修改过的内容:

# module myStrings = Map.Make(String);;
module MyStrings :
sig
 . . .
end
# let m0 = MyStrings.empty;;
val m0 : 'a MyStrings.t = <abstr>
# let m1 = MyStrings.add "abc" ["def"; "ghi"] m0;;
val m1 : string list MyStrings.t = <abstr>
# MyStrings.iter
    (fun s ss -> Printf.printf "%s --> %s\n" s (String.concat " " ss))
    m1;;
abc --> def ghi
- : unit = ()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接