2013-09-27 2 views
1

Привет, ребята, я отношусь к noob с Haskell и все еще изучаю, так почему это не работает?нет. p related filter

filterFirst :: (a -> Bool) -> [a] -> [a] 
filterFirst p xs = delete (not . p) (filter (not . p) xs) 

Как я получаю следующее сообщение об ошибке в моем терминале:

ERROR "FirstLiterate.lhs":58 - Type error in application 
*** Expression  : delete (not . p) (filter (not . p) xs) 
*** Term   : not . p 
*** Type   : a -> Bool 
*** Does not match : a 
*** Because  : unification would give infinite type 

Так что я понимаю, что этот тип не соответствует типу в моем определении. Как я могу изменить это, так что мне не нужно менять (a -> Bool)?

+0

Что вы пытаетесь сделать? 'filter' удалит все элементы, которые не удовлетворяют' p', поэтому неясно, что вы хотите удалить после этого. Вы собираетесь удалить первый элемент, который удовлетворяет некоторому «нет». p'? – kqr

+0

Я хочу удалить первый элемент, который не соответствует свойству p. –

+0

'\ p -> uncurry (++). второй (падение 1). span p', с 'first' из' Control.Arrow' –

ответ

6

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

Ошибка типа вы получили говорит вам, что not . p имеет тип a -> Bool, но функция delete ожидал значение типа a.

0

Вы можете использовать deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a].

+0

'deleteBy' не может использоваться самостоятельно для реализации' deleteFirst', чего хочет OP. –

+0

Он может. 'deleteBy' работает только один раз, это * deleteFirstBy *, а не синоним' filter'. Подсказка: игнорировать один из аргументов функции – nponeccop

+0

D'oh. Извините за -1, видимо, я не знаю 'Data.List' достаточно хорошо :( –

Смежные вопросы