【问题标题】:OCaml - function calling for each element in a listOCaml - 调用列表中每个元素的函数
【发布时间】:2016-01-24 06:59:47
【问题描述】:

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

为了更好地说明我在 OCaml 中主要尝试做的事情,以下是我想要在 Ruby 代码中实现的想法:

arr.each {|x| some_function x}

但我必须只使用递归而不使用迭代函数

【问题讨论】:

  • 你只是在问List.iter 还是我错过了什么?
  • @Sensucht:他可能被要求自己实现List.iter
  • Fold 返回一个列表。如果您不需要滚动自己的递归,您可以使用List.fold_left

标签: recursion functional-programming ocaml


【解决方案1】:

正确的递归函数描述为:

  • 如果列表为空,则什么也不做;
  • 否则,处理第一个元素,然后处理列表的尾部。

对应的代码是:

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

【讨论】:

    【解决方案2】:

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

    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

    我的问题是真诚的。你在哪个部分有问题?否则我们不知道该建议什么。

    【讨论】:

    • 请不要告诉新手在模式匹配时使用if-then-else
    • 不过,很难为一般问题编写模式匹配。我不想写代码,只是列出一些想法。
    • OCaml 中的列表是一种非常特殊的数据类型,可以进行模式匹配。
    • 我很清楚这一点。但我不想为这个人写代码。
    • @EduardoLeón Ocaml 中的列表是典型的递归定义的数据类型,它是每种 FP 语言的基本数据结构——没有什么特别的。
    猜你喜欢
    • 2017-03-05
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多