如何在列表列表中查找具有单个元素的列表
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]
.
抱歉这个问题,但我现在正在破坏我的代码,我找不到解决方案。
对您提供的代码的一些观察:
您的模式需要匹配整个字符串 ll
,但您提供的模式似乎只匹配 ll
的一个元素。更像 [x] :: rest
的模式会更好。
避免无限递归的方法总是一样的。首先,确保检查尽可能小的输入(基础)。对于您的问题,当 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)
我一直在尝试做一个 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]
.
抱歉这个问题,但我现在正在破坏我的代码,我找不到解决方案。
对您提供的代码的一些观察:
您的模式需要匹配整个字符串
ll
,但您提供的模式似乎只匹配ll
的一个元素。更像[x] :: rest
的模式会更好。避免无限递归的方法总是一样的。首先,确保检查尽可能小的输入(基础)。对于您的问题,当
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)