从 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
的参数中删除 []
。不清楚(对我来说)它为什么在那里。
我正在尝试编写一个从整数列表中过滤正整数的函数,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
的参数中删除 []
。不清楚(对我来说)它为什么在那里。