【问题标题】:Extracting values from a function via matching通过匹配从函数中提取值
【发布时间】:2017-03-01 01:33:57
【问题描述】:

我正在处理一项任务,并获得了以下功能:

fun label (lb,ub) =
let val s = callcc (fn k =>let fun branch c = if (c < ub)
                                              then (pushCP (k,branch,c+1);c)
                                              else ub
                           in (pushCP(k,branch,lb+1);lb)
                           end)
in {value=s,dom=(lb,ub)}
end;

如果您将假设 1 和 3 的下限和上限放入此函数中,它将打印

val it = {dom=(1,3), value=1}

我想弄清楚的是是否有可能获得价值。在我的笔记中,它说两种可能的方法是通过#value(x)或通过val {value = a,...} = x,但我在这两种方式都遇到错误。 任何线索我做错了什么?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    由于您没有重现您实际尝试过的内容,因此不清楚您做错了什么,但您的笔记是正确的:

    - val x = {dom=(1,3), value=1};
    val x = {dom=(1,3),value=1} : {dom:int * int, value:int}
    

    第一种方法是使用#value提取value字段和#dom提取dom字段:

    - #value x;
    val it = 1 : int
    - #dom x;
    val it = (1,3) : int * int
    

    第二种方法是使用模式匹配。您可以提取单个字段:

    - val {value = a,...} = x;
    val a = 1 : int
    

    或者您可以同时提取两个字段:

    - val {dom = a, value = b} = x;
    val a = (1,3) : int * int
    val b = 1 : int
    

    为了使上述工作,x 需要绑定到该值。也许您正试图将它与尚未获得 val 绑定的 x 一起使用。你需要有这样的东西:

    val x = label(1,3)
    

    我没有所有相关代码,所以无法测试。如果以上内容不足以回答您的问题,您需要提供更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多