如何在列表列表中查找具有单个元素的列表

时间:2016-04-20 16:14:01

标签: list ocaml

我一直在尝试做一个函数,它返回给我第一个(或者它可能工作但我更喜欢第一个),单个列表的元素,我的意思是:

[[x;y;z];[a;b;c];[a];[b]]

在这种情况下,我希望返回a[a],但我无法尝试执行以下功能:

let rec find_unit ll =
match ll with
|[x]    -> [x]
and so on...

但每次我尝试这样的东西时,我都会进入一个永不停止的递归,或者函数简单不会返回元素。谁能告诉我如何正确地做到这一点?我仍然无法理解很多OCaml语法......就像在示例中我不知道要放在|[x] -> [x]的行中,特别是第一个[x]

很抱歉这个问题,但我现在正在破坏我的代码,我无法找到解决方案。

3 个答案:

答案 0 :(得分:3)

尝试将问题分解为较小的子问题。

(1)你的问题整体看起来像是一个更普遍的“发现”问题的实例,已经解决了。请参阅标准函数List.find或(如果要查找全部... List.find_all。两个函数都需要谓词从列表中选择正确的元素。

(2)您需要一种方法来确定某个列表是否是单例。这很容易,使用pattern-mathing。

let is_singleton xs = function
  | [_] -> true
  | _   -> false

(3)现在,结合上述内容,您将得到一个解决方案。

答案 1 :(得分:0)

关于您提供的代码的几点意见:

  1. 您的模式需要匹配整个字符串ll,但您提供的模式似乎只能匹配ll的一个元素。更像[x] :: rest的模式可以更好地发挥作用。

  2. 避免无限递归的方法总是一样的。首先,确保检查可能的最小输入(基础)。对于您的问题,ll为空列表时就是这种情况。其次,如果您还没找到所需的内容,请继续搜索较小的问题。在您的情况下,这将意味着搜索列表的尾部。

  3. 如果列表中没有您要查找的元素,您还需要决定要做什么。如果您在找到它时返回[x],则可以返回[](比如说​​),如果找不到它。或者您可以引发Not_found之类的异常。

    (作为旁注,OCaml中的列表和数组是不同的。我删除了array标记,因为您的问题似乎与列表有关。)

答案 2 :(得分:0)

这里的所有答案都帮助我找到了解决问题的方法,我将把它放在这里,因为它可能会帮助别人。 我使用了这个功能:

let is_single xs = function
|[_]    -> true
|_  -> false
;;

要执行的操作:let teste xs = List.filter(fun inner ->(is_single inner)inner)xs;;teste函数返回给我一个包含所有单个元素的列表列表,因此要在列表中只获取一个元素:List.hd(List.hd teste xs) < / p>