我经常有理由在地图中查找一些关键字,然后在另一个地图中查找结果,依此类推,并寻求推广流程.我还希望能够为此目的预先计算地图列表,以表示AI项目中可重复使用的关联链.
显而易见的解决方案似乎是我称之为"maybe_map"的列表上的map函数的简单扩展.
let rec maybe_map operation initial_value list =
match list with
| [] -> Some(initial_value)
| first::rest ->
match operation initial_value first with
| None -> None
| Some(subsequent_value) -> maybe_map operation subsequent_value rest
Run Code Online (Sandbox Code Playgroud)
以下是其使用示例.
let employee_department = Map.ofList([("John", "Sales" ); ("Bob", "IT" )])
let department_country = Map.ofList([("IT", "USA" ); ("Sales", "France")])
let country_currency = Map.ofList([("USA", "Dollar"); ("France", "Euro" )])
let result = maybe_map Map.tryFind "John" [employee_department; department_country; country_currency]
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作并产生结果Some("Euro").当我需要使用地图的域和范围类型不同的数据时,问题就出现了.例如,如果我在上面的示例中添加汇率图,则类型检查器会抱怨,即使所涉及的各个操作都不会失败.
let exchange_rate = Map.ofList([("Euro", 1.08); ("Dollar", 1.2)])
let result1 …Run Code Online (Sandbox Code Playgroud)