【问题标题】:Filtering integers from list of list in OCaml从 OCaml 中的列表列表中过滤整数
【发布时间】:2020-02-26 14:51:08
【问题描述】:

我正在尝试编写一个函数,从整数列表中过滤正整数,返回一个仅包含负整数的列表。

例如,如果我有一个列表列表,例如 [[-1; 1]; [1]; [-1;-1]] 它将返回 [[-1]; []; [-1;-1]]。

我尝试使用我教科书中的过滤和转换功能。

let rec transform (f:'a -> 'b) (l:'a list) : 'b list =
begin match l with
| [] -> []
| x::tl -> (f x)::(transform f tl)
end

对于过滤器,我之前写过:

let rec filter (pred: 'a -> bool) (l: 'a list) : 'a list =
  begin match l with
  | [] -> []
  | x :: tl -> if pred x then x :: (filter pred tl) else filter pred tl
  end

所以,使用这些,我写了

let filter_negatives (l: int list list) : int list list = 
  transform (fun l -> (filter(fun i -> i<0)) + l) [] l 

但我仍然无法完全理解匿名函数,而且我收到了我不知道该怎么做的错误消息。

这个函数有类型 ('a -> 'b) -> 'a list -> 'b list 它适用于太多的论点;也许你忘记了一个 `;'。

【问题讨论】:

    标签: list int ocaml


    【解决方案1】:

    (因为这个 transform 函数更常见的是 map。)

    错误消息告诉您一个简单而真实的事实。 transform 函数有两个参数:一个函数和一个列表。你给它 3 个参数。所以肯定有问题。

    您希望对列表的每个元素进行的转换是过滤。所以,如果你从你的转换函数中删除+(这真的没有任何意义),你就会得到非常接近你想要的东西。

    您可能只需要从transform 的参数中删除[]。我不清楚(对我来说)它为什么会在那里。

    【讨论】:

    • 看起来像尾递归变换中的东西,结果的累加器。但是这里的变换不是尾递归的,只有 2 个参数。我同意 [] 不应该在那里。
    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2016-08-16
    • 2017-05-08
    相关资源
    最近更新 更多