从 OCaml 中的列表列表中过滤整数

Filtering integers from list of list in OCaml

我正在尝试编写一个从整数列表中过滤正整数的函数,return只过滤负整数列表。

例如,如果我有一个列表列表,例如 [[-1; 1]; [1]; [-1;-1]] 它将 return [[-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 

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

This function has type ('a -> 'b) -> 'a list -> 'b list It is applied to too many arguments; maybe you forgot a `;'.

(这个 transform 函数的价值通常被称为 map。)

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

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

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