【问题标题】:Have Trouble Understanding OCaml Code无法理解 OCaml 代码
【发布时间】:2015-01-26 04:41:27
【问题描述】:

我需要修改一个 OCaml 函数:

let removeDuplicates l = 
  let rec helper (seen,rest) = 
      match rest with 
        [] -> seen
      | h::t -> 
        let seen' = failwith "to be written" in
        let rest' = failwith "to be written" in 
      helper (seen',rest') 
  in
      List.rev (helper ([],l));;

该函数需要获取一个列表 l 并返回删除了所有重复项的列表。 failwith "to be written" 部分是我应该编写代码的地方。我了解辅助函数的工作原理,但无法理解这部分辅助函数(seen',rest')。我不确定该功能应该如何与这部分一起流动,或者当您将一堆in 包含在一起时它是如何工作的。我们可以使用 List.rev 来反转列表,list.mem 如果某个元素在列表中则返回 true。有人可以向我解释一下函数的流程应该如何工作,以便我可以开始编写解决方案。

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    那行令人困惑,因为它的缩进不正确,或者我会这么说。正确的缩进如下所示:

        let seen' = failwith "to be written" in
        let rest' = failwith "to be written" in 
        helper (seen',rest') 
    

    它的意思是:计算seen 的新值和rest 的新值,然后用这两个新值递归调用自己。

    【讨论】:

    • 所以基本上我在 ([],l) 上调用帮助函数,其中 seen 开始为空, l 是整个列表,然后它进行模式匹配和递归,最后我想返回向后列出元素列表,以便我可以对其执行 List.rev 吗?也因为看到以 [] 开头,其余是整个列表,我是否希望看到成为我看到的每个不重复的元素,并在函数末尾成为空列表?
    • 听起来不错。很多时候,您不必尝试向后累积列表,它就是这样发生的。因此,该作业通过展示如何处理来帮助您。 (它只会增加线性时间来在最后反转列表。)
    • 既然看到以 [] 开头,其余是整个列表,我是否希望看到成为我看到的每个不重复的元素,其余成为函数末尾的空列表?跨度>
    • 这听起来很合理。我不想为你解决你的任务:-)
    • 是的,我明白了,感谢您的帮助,这很有效 let removeDuplicates l = let rec helper (seen,rest) = match rest with [] -> seen | h::t -> let seen' = if(List.mem h seen) then seen else (h::seen) in let rest' = t in helper (seen',rest') in List.rev (helper ([ ],l)) ;;
    猜你喜欢
    • 2014-03-19
    • 2012-02-17
    • 1970-01-01
    • 2012-08-05
    • 2011-12-18
    • 2017-11-13
    • 2018-02-21
    • 2015-08-22
    • 2016-01-16
    相关资源
    最近更新 更多