OCaml - 函数调用列表中的每个元素
OCaml - function calling for each element in a list
仅使用递归(即没有任何类型的循环),给定一个元素列表,我如何在 OCaml 中每次使用该元素作为参数每次为列表中的每个元素调用一个函数? Fold 和 map 不起作用,因为尽管它们对每个元素都应用了一个函数,但它 returns 是我对每个元素调用的任何函数的列表,这不是我想要的。
为了更好地说明我在 OCaml 中的本质尝试,下面是我想要在 Ruby 代码中实现的想法:
arr.each {|x| some_function x}
但我必须只使用递归而不使用迭代器函数
递归函数的一个相当通用的模板是这样的:
let rec f x =
if x is trival to handle then
handle x
else
let (part, rest) = division of x into smaller parts in
let part_result = handle_part part in
let recursive_result = f rest in
combine part_result recursive_result
由于不需要结果,因此可以跳过其中的大部分内容。
此模板的哪些部分最难解决您的问题?
更新
(正如@EduardoLeón 指出的那样,在处理列表时,您可以测试普通列表 和 使用模式匹配将列表分解成更小的部分。模式匹配很酷。 )
更新 2
我的问题是真诚的。你的哪一部分有问题?否则我们不知道该建议什么。
正确的递归函数描述为:
- 如果列表为空,什么也不做;
- 否则,处理第一个元素,然后处理列表的尾部。
对应的代码为:
let rec do_all f lst =
match lst with
| [] -> ()
| x :: xs -> f x; do_all f xs
仅使用递归(即没有任何类型的循环),给定一个元素列表,我如何在 OCaml 中每次使用该元素作为参数每次为列表中的每个元素调用一个函数? Fold 和 map 不起作用,因为尽管它们对每个元素都应用了一个函数,但它 returns 是我对每个元素调用的任何函数的列表,这不是我想要的。
为了更好地说明我在 OCaml 中的本质尝试,下面是我想要在 Ruby 代码中实现的想法:
arr.each {|x| some_function x}
但我必须只使用递归而不使用迭代器函数
递归函数的一个相当通用的模板是这样的:
let rec f x =
if x is trival to handle then
handle x
else
let (part, rest) = division of x into smaller parts in
let part_result = handle_part part in
let recursive_result = f rest in
combine part_result recursive_result
由于不需要结果,因此可以跳过其中的大部分内容。
此模板的哪些部分最难解决您的问题?
更新
(正如@EduardoLeón 指出的那样,在处理列表时,您可以测试普通列表 和 使用模式匹配将列表分解成更小的部分。模式匹配很酷。 )
更新 2
我的问题是真诚的。你的哪一部分有问题?否则我们不知道该建议什么。
正确的递归函数描述为:
- 如果列表为空,什么也不做;
- 否则,处理第一个元素,然后处理列表的尾部。
对应的代码为:
let rec do_all f lst =
match lst with
| [] -> ()
| x :: xs -> f x; do_all f xs