【问题标题】:F# list of key value pairs to variable assignmentsF# 到变量赋值的键值对列表
【发布时间】:2017-04-06 20:03:07
【问题描述】:

给定一个键/值对列表:

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 个项目,并且这些项目是 的元组,但事先不知道是否可能存在“A”或“B”或其他键或者如果列表为空。

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

更新:上下文注释

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

【问题讨论】:

  • 为什么要这样做?之后你将如何处理它们?

标签: list variables f#


【解决方案1】:

如果你想稍后在代码中对变量做一些事情,那么它们需要在作用域内——所以你不可避免地必须以某种方式声明变量。最简单的选择是使它们可变并根据列表中的值对其进行变异:

let mutable A = 0
let mutable B = 0

为了使突变更容易一些,您可以使用 setter 创建一个查找表:

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

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

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

由于您问题的上下文有限,很难说这是否是实现真正激发您的问题的好方法 - 作为 F# 代码,它看起来确实有点难看,如果您添加更多上下文,有人可以提出更好的方法。

【讨论】:

  • 在原帖中添加了一些上下文
【解决方案2】:

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

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# 中,约定是绑定名称(变量名称)以小写字母开头。

【讨论】:

  • 不错!那会很好的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2012-04-01
  • 2017-11-11
  • 2010-11-09
相关资源
最近更新 更多