2016-01-14 4 views
0

Я пытаюсь сделать функцию, которая принимает в качестве входных данных предикат и список. и удаляет все элементы из списка, для которого выполняется предикат. То, что я до сих пор является следующая функция:Удаление элементов из списка, если предикат выполняется

removeif :: func->[a]->[a] 
removeif [] = [] 
removeif func (h:t)= if func then delete h (h:t) else removeif func t 

Я смущен о func части func->[a]->[a], потому что я не знаю, как я должен сказать, что его предикат.

Например, что я хочу, что я даю от терминала этой команды

removeif threefolds [1,2,3,4,5,6,7,8,9] 

threefolds является локальной функцией у меня есть, и она возвращает бесконечный список с кратными трех, и я хочу, чтобы удалить эти мультипликаторы из список ввода. Я думаю сделать threefold функцией bool, но не уверен, что это необходимо.

+4

' removeIf p = filter (not. p) ' – Cactus

+2

Я не понимаю вопроса. Предикат - это функция с типом 'a -> Bool' для некоторого' a'. Условие 'if' нуждается в' Bool', поэтому вы не можете сделать это, если хотите использовать код, подобный этому. – Bakuriu

+0

@Cactus Большое вам спасибо, его хорошая идея, чтобы начать с :) – Nia

ответ

3

Предикат должен быть функцией типа a -> Bool. Таким образом, подпись removeif должна быть

removeif :: (a -> Bool) -> [a] -> [a] 

Если threefolds имеет тип a -> Bool, вам будет хорошо :-)

1

Фано должна возвращать логическое значение, что-то вроде этого:

let threefolds x = x `mod` 3 == 0 
+0

Спасибо, я попробую :) – Nia

+2

Затем используйте фильтр как кактус в вашем определении removeIf: –