代码之家  ›  专栏  ›  技术社区  ›  Hibou57

SML记录子集和更新

sml
  •  5
  • Hibou57  · 技术社区  · 12 年前

    是否有一种更直接的方法(由于涉及的维护和编辑量,不易出错)来实现以下目标,即:1)获得记录元素的子集,给定感兴趣成员的列表,2)使用子集记录的名称从子集记录更新记录?

    val r = {a = 1, b = 2, c = 3, d = 4, e = 5}
    val s = {b = #b r, c = #c r, d = #d r}
    val r = {a = #a r, b = #b s, c = #c s, d = #d s, e = #e r}
    

    我期望的可能是这样的:

    val r = {a = 1, b = 2, c = 3, d = 4, e = 5}
    val s = #(b, c, d) r
    val r = r / s
    

    正如Sebastian Paaske Trhol所说,人们可以通过以下方式提取部分记录:

    val {b, c, d, ...} = r
    

    不幸的是,这并没有将子集绑定到单个名称,例如,这是不起作用的:

    val s = {b, c, d, ...} = r
    
    2 回复  |  直到 12 年前
        1
  •  4
  •   Andreas Rossberg    12 年前

    不,没有。曾经有一个更广泛的记录业务的提议( Functional record extension and row capture ),作为短暂的后继ML努力的一部分。有了这个,你可以写,例如。,

    val r = {a = 1, b = 2, c = 3, d = 4, e = 5}
    val {a, e, ... = s} = r
    val t = {a = a+1, e = e-1, ... = s}
    

    不幸的是,没有人在真正的编译器中实现过它。

        2
  •  4
  •   Sebastian Paaske Tørholm    12 年前

    您可以使用模式匹配提取记录的相关部分:

    例子:

    val question = { title = "SML record subset and update",
                     author = "Hibou57",
                     tags = ["SML"] }
    
    val { title = t, tags = ts, ... } = question
    

    这将标题绑定到 t 并标记到 ts .

    如果您愿意,您也可以省略名称:

    val { title, tags, ... } = question
    

    这将标题绑定到 title 和标记到 tags .

    就更新而言,遗憾的是,Standard ML没有一种很好的方法来更新记录,而无需明确设置每个字段。