【问题标题】:OCaml: Returning Full List after Change to ElementOCaml:更改元素后返回完整列表
【发布时间】:2014-12-12 07:51:12
【问题描述】:

上下文:

中,当取一个完整的list作为参数时,假设change方法遍历list,如果在@987654326中搜索variable成功@,然后我们将该变量的绑定更改为另一个值。现在,我的代码在底部,除了返回完整列表之外,它可以正确执行所有操作。

为清楚起见,最好将此列表视为包含元组的字典。

问题:

我的表达式如何保存正在接收的列表并返回它,在遍历它时?关于已识别的问题(见下文),仅返回列表的一部分:这是表达式中的根本缺陷,还是很容易修复?如果这是一个简单的解决方法,那么可以添加什么来将其用于最终返回?

代码:

let rec change key value dict =
  match dict with
    | [] -> [(key, value)] (*Adding to the dictionary*)
    | (a,b) :: dict -> if compare a key = 0 then (a, value)::dict      (*changing value*)
                       else                      change key value dict (*continue search*)
;;

代码示例:

# let list = [(1,2);(4,2);(2,1)];;
val list : (int * int) list = [(1, 2); (4, 2); (2, 1)]
# change 2 3 list;;
- : (int * int) list = [(2, 3)]
# change 1 1 list
  ;;
- : (int * int) list = [(1, 1); (4, 2); (2, 1)]
# change 4 1 list
  ;;
- : (int * int) list = [(4, 1); (2, 1)]
# change 7 1 list
  ;;
- : (int * int) list = [(7, 1)]

回答:

let rec change key value dict =
  match dict with
    | [] -> (key, value)::dict (*Adding to the dictionary*)
    | (a,b) :: dict -> if compare a key = 0 then (a, value)::dict (*changing value*)
                       else (a,b)::change key value dict (*continue search*)
;;

如果您看到上述内容,在第五行的 else 语句中,添加了 (a,b)::,它以正确的方式进行递归。

【问题讨论】:

    标签: ocaml list recursion dictionary ocaml


    【解决方案1】:

    像函数式程序员那样思考可能会有所帮助。我想说的是,您应该停止将其视为对旧列表的更改。您应该将其视为一个全新的列表。

    换句话说,你可能想这样想:

    • 如果列表为空,则结果为空
    • 如果列表看起来像 hd :: tl,则结果取决于 hd 的样子。
    • 特别是,如果 hd 是我应该修改的内容,则结果看起来像修改后的 hd 后跟修改后的 tl
    • 但如果头部不是我应该修改的东西,结果看起来像 hd 后跟修改后的 tl

    如果你这么想,代码应该很容易写。

    更新

    您的字典中似乎有一些我没有考虑到的不变量。如果您知道字典条目是唯一的,则第三种情况会更改为返回修改后的hd,然后是旧的tl

    如果您还想添加未出现的条目,则第一个项目符号将更改为返回您的一对列表(而不是返回空列表)。

    我试图说明一种更实用的思维方式(可能不成功,但这就是我正在尝试的 :-)。

    【讨论】:

    • 那么,我可能需要删除我目前拥有的东西,然后重新开始? :)
    • 就代码而言,这只是一个微小的变化。我试图建议一种 FP 风格的方式来看待有助于解决很多问题的事物。但无论如何,没有必要扔掉你所拥有的。你可以调整它。另外,我没有意识到如果新对不存在,您要添加它。所以这有点不同。
    • 我同意您的编辑,并欣赏路径与答案。我会玩一会儿!
    • 刚刚弄明白了:缺少(a,b)::change num1 num2 dict ;)
    猜你喜欢
    • 2014-12-20
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多