F#变量赋值的键值对列表

时间:2017-04-06 20:03:07

标签: list variables f#

给出一个键/值对列表:

do 
    [("A", 1);("B",2)]
    |> (fun list -> 
            for item in list do
                match item with
                | ("A", x) -> //expression assigning x to variable "A"
                | ("B", x) -> //expression assigning x to variable "B"
                | _ ->  //default expression
       )

是否有一些我可以编写的表达式可以完成与

相同的操作
let A = 1
let B = 2

我事先知道列表中的项目不超过10项,并且项目是< string,int>的元组。但事先并不知道是否" A"或" B"或其他密钥可能存在或列表为空。

基本上,将列表分解为一组类型变量。

更新:关于上下文的注释

在我的应用程序中,我从其他团队维护的上游程序中收到一个键/值对列表。我希望某些键位于列表中,我想将其分配给类型变量以供以后处理。如果我需要的东西丢失,我会抛出异常。但是,除了预期的变量名之外,我不想被锁定到任何给定的变量名称集。对于所有这些,我希望能够在运行时分配它们。

2 个答案:

答案 0 :(得分:6)

如果您希望稍后在代码中对变量执行某些操作,那么它们将需要在范围内 - 因此您将不可避免地以某种方式声明变量。最简单的选择是使它们可变并根据列表中的值进行变异:

let mutable A = 0
let mutable B = 0

为了使变异更容易,您可以使用setter创建查找表:

let setters = 
  dict [ ("A", fun x -> A <- x); ("B", fun x -> B <- x) ]

现在,您可以迭代输入,使用字典查找来获取适当的setter并调用它来设置变量值:

for var, value in [("A", 1);("B",2)] do
  setters.[var] value

由于你的问题的背景有限,有点难以说这是否是一个很好的方法来实现你的问题实际上是什么 - 作为F#代码,它确实看起来有点难看,如果你有可能添加更多上下文,有人可以建议更好的方式。

答案 1 :(得分:1)

听起来你有一些动态数据可以很好地表示为地图:

let data = Map [ ("A", 1); ("B", 2) ]

let a = Map.find "A" data
// throws an exception if "A" is not present

let b = Map.find "B" data
// throws an exception if "B" is not present

let c = Map.tryFind "C" data
// "C" is not present so c = None

注意:在F#中,约定是绑定名称(变量名称)以小写字母开头。