给出一个键/值对列表:
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"或其他密钥可能存在或列表为空。
基本上,将列表分解为一组类型变量。
更新:关于上下文的注释
在我的应用程序中,我从其他团队维护的上游程序中收到一个键/值对列表。我希望某些键位于列表中,我想将其分配给类型变量以供以后处理。如果我需要的东西丢失,我会抛出异常。但是,除了预期的变量名之外,我不想被锁定到任何给定的变量名称集。对于所有这些,我希望能够在运行时分配它们。
答案 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#中,约定是绑定名称(变量名称)以小写字母开头。