小编use*_*041的帖子

如何在F#中自动化地图查找链?

我经常有理由在地图中查找一些关键字,然后在另一个地图中查找结果,依此类推,并寻求推广流程.我还希望能够为此目的预先计算地图列表,以表示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)

monads f# types map

5
推荐指数
1
解决办法
181
查看次数

标签 统计

f# ×1

map ×1

monads ×1

types ×1