【问题标题】:List.fold_left in OCamlOCaml 中的 List.fold_left
【发布时间】:2012-12-31 01:06:03
【问题描述】:

我写了一个函数,它添加了给定列表中的所有元素:

let rec add = function []->0 | h::t->h+add(t);;

现在我想编写相同的函数,但使用List.fold_left,但我尝试了几次更改但仍然出现错误。首先我尝试了这个:

let rec add = function []->0 | h::t-> add List.fold_left((fun h t-> h+t) h t);;

但我有一个错误,我注意到 List.fold_left 返回一个 int 值,因此递归是不必要的。所以我换了:

let add = function []->0 | h::t -> List.fold_left ( fun h t-> h+t h t);;

但我仍然收到关于错误类型的错误: Error: This expression has type int -> 'a -> 'b but an expression was expected of type 'a 但我不知道如何解决这个问题,谁能解释我在这个例子中如何使用List.fold_left

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    fold_left 对列表进行操作,就像您的函数一样,通过应用函数并以特定方式累积结果。它会为您处理和抽象递归。它处理列表的结构,因此您可以处理如何以特定方式组合列表的元素。所以,你需要弄清楚你想应用于 fold_left 的高阶函数,它以相同的方式对列表进行操作。

    例如,这里有两种获取列表最大元素的方法,...

    let rec max_list smallest lst = match lst with 
        | []   -> smallest
        | h::t -> max_list (max smallest h) t
    
    let max_list smallest lst =
        List.fold_left (fun acc x -> max acc x) smallest lst
    

    您会注意到功能的某些方面的相似之处;基本情况(最小)以及如何组合元素(使用函数 max)。您应该在您的函数中看到相同的相似之处。

    回顾你的最终实现,

    let add = function | []->0
                       | h::t -> List.fold_left (fun h t-> h+t h t)
    

    这里的问题是你的括号放错了...

    let add = function | []->0
                       | h::t -> List.fold_left (fun h t-> h+t) h t
    

    但这可以简化,类似于我上面的例子。

    【讨论】:

      【解决方案2】:

      一种将整数列表相加的方法:

      # List.fold_left (+) 0 [1; 3; 5; 7];;
      - : int = 16
      

      【讨论】:

        【解决方案3】:

        如果使用 Core.Std,则需要命名参数,例如,

        List.fold_left ~f:(+) ~init:0 [1; 3; 5; 7];;
        - : int = 16
        

        【讨论】:

          猜你喜欢
          • 2012-09-29
          • 2013-09-13
          • 2015-01-13
          • 1970-01-01
          • 1970-01-01
          • 2013-01-05
          • 2021-08-14
          • 2017-02-24
          • 1970-01-01
          相关资源
          最近更新 更多