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

How to find inside a list of lists a list with a single element

我一直在尝试做一个 return 对我来说第一个的功能(或者它可能起作用的所有功能,但我确实更喜欢第一个),单个列表列表的元素,我的意思是:

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

在这种情况下,我想 return 编辑 a[a],但我不能尝试执行类似以下的功能:

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

但每次我尝试这样的事情时,我都会进入一个永不停止的递归,或者函数简单不 return 元素。有人可以告诉我如何正确地做吗?我仍然无法理解很多 OCaml 语法...就像在示例中一样,我不知道要放入 |[x] -> [x] 行,尤其是第一个 [x].

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

对您提供的代码的一些观察:

  1. 您的模式需要匹配整个字符串 ll,但您提供的模式似乎只匹配 ll 的一个元素。更像 [x] :: rest 的模式会更好。

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

您还需要决定当列表中没有您要查找的元素时要做什么。如果你 return [x] 当你找到它时,你可以 return [] (比方说)如果你找不到它。或者您可以引发异常 Not_found.

(作为旁注,列表和数组在 OCaml 中是不同的东西。我删除了 array 标签,因为你的问题似乎是关于列表的。)

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

(1) 您的问题总体上看起来像是更普遍的 'find' 问题的一个实例,该问题已经解决。请参阅标准函数 List.find 或(如果您想全部找到它们...... List.find_all。这两个函数都需要一个谓词来从列表中选择正确的元素。

(2) 您需要一种方法来确定某个列表是否为单例。很简单,使用模式数学。

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

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

好吧,这里的所有答案都帮助我找到了解决问题的方法,我将把它放在这里,因为它可能会对其他人有所帮助。 我使用了函数:

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)