我一直在尝试做一个函数,它返回给我第一个(或者它可能工作但我更喜欢第一个),单个列表的元素,我的意思是:
[[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]
。
很抱歉这个问题,但我现在正在破坏我的代码,我无法找到解决方案。
答案 0 :(得分:3)
尝试将问题分解为较小的子问题。
(1)你的问题整体看起来像是一个更普遍的“发现”问题的实例,已经解决了。请参阅标准函数List.find
或(如果要查找全部... List.find_all
。两个函数都需要谓词从列表中选择正确的元素。
(2)您需要一种方法来确定某个列表是否是单例。这很容易,使用pattern-mathing。
let is_singleton xs = function
| [_] -> true
| _ -> false
(3)现在,结合上述内容,您将得到一个解决方案。
答案 1 :(得分:0)
关于您提供的代码的几点意见:
您的模式需要匹配整个字符串ll
,但您提供的模式似乎只能匹配ll
的一个元素。更像[x] :: rest
的模式可以更好地发挥作用。
避免无限递归的方法总是一样的。首先,确保检查可能的最小输入(基础)。对于您的问题,ll
为空列表时就是这种情况。其次,如果您还没找到所需的内容,请继续搜索较小的问题。在您的情况下,这将意味着搜索列表的尾部。
如果列表中没有您要查找的元素,您还需要决定要做什么。如果您在找到它时返回[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>