【问题标题】:Ocaml manipulating listsOcaml 操作列表
【发布时间】:2013-01-16 08:11:04
【问题描述】:

这里有一个真正的基本问题:我是 Ocaml 的新手,我在尝试操作列表时遇到了问题。我读过http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html,不幸的是我仍然感到困惑......我是函数式编程的新手。

如果我有以下功能:

  let stoverfl list1 list2 list3 =
      match list1 with
      |[]->None
      |h::list1 -> (*what I want to do goes in here*)

我想看看list2和list3的第一个元素,比较一下,如果相等,就把list3的第一个元素加到list2中,否则不修改列表。我现在并不关心错误检查(即检查列表是否至少包含一个元素等)。

我的尝试:

 h::list1 -> let cmp1 = hd list2 (*this should return the first elemnt of list2??*)
             let cmp2 = hd list3
             if(cmp1=cmp2) then
                let updlist2 = concat list2 hd list3
                let updlist3 = hd list3
                (*pass updlist2 and updlist3 instead of list2 and list3 to next function*)
             else
                (*do nothing; pass list2 and list3 as normal*)

我觉得我做错了...任何建议将不胜感激! 谢谢。

【问题讨论】:

    标签: list ocaml


    【解决方案1】:

    您说要将list3 的第一个元素添加到list2。当一个函数式程序员说这样的话时,这意味着他们想要构建一个所描述的新列表。您实际上无法修改list2--列表是不可变的,并且名称永久绑定到单个值。实际上,您似乎想要构造 两个 新列表。其中一个在list3 的前面有list2 的第一个元素。另一个是list2 的剩余部分(除了第一个元素)。

    假设这就是您的意思,并且假设您不担心列表是否为空,那么这是获取这些值的一种方法:

    let updlist2 = List.tl list2 in
    let updlist3 = (List.hd list2) :: list3
    

    实际上和你写的很接近。

    但是,我想知道您接下来将如何处理这些值。如果您想将它们传递给另一个函数,将lets if 之外放置会更正常。例如,这里有一些代码调用一个函数g,它带有一个列表或列表的尾部,具体取决于列表的第一个元素:

    let arg_for_g =
        match the_list with
        | [] -> []  (* No tail of the list *)
        | head :: tail -> if head = 3 then tail else the_list
    in
        g arg_for_g
    

    如果将lets 放在if 中,则需要对下一个函数的两个不同调用进行编码。这可能很好,这完全取决于您将如何处理您的价值观。

    (附带说明,您应该担心列表是否为空!如果您使用match 语句,您可以很容易地检测到这种情况。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多