调用列表中每个元素的函数

问题描述 投票:0回答:2

仅使用递归(即没有任何类型的循环),给定一个元素列表,如何在 OCaml 中每次使用该元素作为参数来每次为列表中的每个元素调用一个函数? Fold 和 map 不起作用,因为虽然它们对每个元素应用一个函数,但它返回我在每个元素上调用的任何函数的列表,这不是我想要的。

为了更好地说明我在 OCaml 中本质上想要做什么,以下是我想要在 Ruby 代码中实现的想法:

arr.each {|x| some_function x}

但我必须仅使用递归而不使用 iter 函数来完成此操作

recursion functional-programming ocaml
2个回答
7
投票

正确的递归函数描述为:

  • 如果列表为空,则不执行任何操作;
  • 否则,处理第一个元素,然后处理列表的尾部。

对应的代码是:

let rec do_all f lst =
match lst with
| [] -> ()
| x :: xs -> f x; do_all f xs

0
投票

递归函数的一个相当通用的模板是这样的:

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 指出的,在使用列表时,您可以测试一个简单的列表并且使用模式匹配将列表分解为更小的部分。模式匹配很酷。

© www.soinside.com 2019 - 2024. All rights reserved.