1

这里真正的基本问题:我是 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*)

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

4

1 回答 1

1

您说要添加 to 的第一个list3元素list2。当一个函数式程序员说这样的话时,这意味着他们想要构建一个所描述的新列表。您实际上无法修改list2--lists 是不可变的,并且名称永久绑定到单个值。实际上,您似乎想要构建两个新列表。其中一个list2在 的前面有第一个元素list3。另一个是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语句,您可以很容易地检测到这种情况。)

于 2013-02-01T04:31:43.093 回答