通过带有条件语句的ocaml列表进行迭代
问题描述:
ocaml的新功能,所以我可以来这里的所有内容都是伪代码。通过带有条件语句的ocaml列表进行迭代
我想写一个函数,它需要一个列表,然后返回一个只有奇数整数的新列表。
因此,只需遍历列表,可能使用%2来查找奇数整数,然后将这些附加到新列表中。
作为ocaml的新手,我已经研究过可能有用的东西,比如地图,rev-map或iter,甚至可能是过滤器?。
最好使用什么,以及如何设置它?
答
最适合的功能是filter
in List module。看看它的签名和说明:
val filter : ('a -> bool) -> 'a list -> 'a list
滤波器P升返回列表L满足 谓词p的所有元素。输入列表中元素的顺序被保留。
你应该知道如何提供在你的问题中清楚地描述的检查奇数整数的谓词。
另一个不太优雅的解决方案是:
- 通过列表简单迭代,并使用蓄能器列表收集结果。
- 如果一个元素是一个奇数,则将其前置到累加器。
- 颠倒累加器以获得正确的顺序。
此解决方案涉及List.fold_left
用于累积结果,List.rev
用于反转列表。
由于您只询问哪些功能是合适的,希望您能够自己使用它们。
编辑:
因为您共享您的List.filter
尝试,这里有一个方法来使用它:
let odds xs = List.filter (fun x -> x mod 2 <> 0) xs
为了能够与OCaml中得到进一步的,请花一些时间来阅读一个OCaml教程。 OCaml tag wiki拥有相当多的入门资源。
谢谢。当然,我可以浏览并且可以很好地猜测哪些函数最适合,但是我只是无法理解语法。 如果我要使用过滤器,我在想什么看起来是这样的: 让oddfunc MYLIST = List.filter(MYLIST X - > [如果{!X%2 = 0}然后,追加列出 正如你所看到的,我对ocaml语法的理解很差,并且大多只是记下我的伪观点。 – 2012-03-10 00:22:03
@JohnRedyns:查看我的更新答案。 – pad 2012-03-10 00:33:39
填充引用的类型告诉您需要知道的内容。 'List.filter'接受一个函数和一个列表并返回另一个列表。该函数告诉您是否希望该元素出现在结果中。所以接下来你需要的是一个函数,如果一个数字是奇数,则返回“true”。它应该适用于任何'int',它不必(也不应该)知道任何关于'mylist'的信息。 – 2012-03-10 00:34:22