OCaml 将字符串映射到字符串列表
OCaml map a string to a list of strings
我正在尝试在 OCaml 中创建一个将字符串映射到字符串列表的字典。我已经参考了 this 基本字符串到字符串映射的教程,但我需要一些帮助来制作列表。
这是我想在 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
提前致谢
你可以只使用列表,
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"]
OCaml 中的数组和列表不同。我假设您想使用列表(如您的标题)而不是数组(如您问题的 body)。
以下是教程中的一些稍作修改的行:
# 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 = ()
我正在尝试在 OCaml 中创建一个将字符串映射到字符串列表的字典。我已经参考了 this 基本字符串到字符串映射的教程,但我需要一些帮助来制作列表。
这是我想在 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
提前致谢
你可以只使用列表,
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"]
OCaml 中的数组和列表不同。我假设您想使用列表(如您的标题)而不是数组(如您问题的 body)。
以下是教程中的一些稍作修改的行:
# 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 = ()