Фильтрация целых чисел из списка в OCaml - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь написать функцию, которая фильтрует положительные целые числа из списка целых чисел, возвращая список только отрицательных целых чисел.

Например, если у меня есть список списка, например [[-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. Она применяется к слишком многим аргументам; может быть, вы забыли `; '.

1 Ответ

1 голос
/ 26 февраля 2020

(Для чего стоит эта функция transform чаще называется map.)

Сообщение об ошибке говорит вам простой, истинный факт. Функция transform принимает два аргумента: функцию и список. Вы даете этому 3 аргумента. Так что что-то должно быть не так.

Преобразование, которое вы хотите выполнить с каждым элементом списка, - это фильтрация. Итак, если вы удалите + (что на самом деле не имеет никакого смысла) из функции преобразования, у вас будет что-то очень близкое к тому, что вы хотите.

Возможно, вам просто нужно удалить [] из аргументы transform. Мне непонятно, почему это так.

...