Как использовать фильтр, как если бы тогда еще заявление в списке? - PullRequest
0 голосов
/ 17 апреля 2011

Я хотел бы добавить 1 элемент в список, в котором есть только один элемент, и добавить элементы (после использования toInt для преобразования в целое число) в список y, если количество элементов больше 1 и последние элементы совпадают

Как это сделать?

import Data.List.Split

z = splitOn "+" "x^2+2*x^3+x^2"

y = map (splitOn "*") z

x = map head y

toInt :: [String] -> [Int]
toInt = map read

u = filter ((map length y)>1) y

Couldn't match expected type `a0 -> Bool' with actual type `Bool'
In the first argument of `filter', namely `((map length y) > 1)'
In the expression: filter ((map length y) > 1) y
In an equation for `u': u = filter ((map length y) > 1) y

Не удалось, загружены модули: нет.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2011

Ваше определение u явно плохое. Это помогает, если вы даете типовые подписи, поэтому мы немного лучше понимаем, что вы пытаетесь сделать (даже если вы не говорите нам словами).

Вы прокомментировали, что хотите, чтобы все списки имели длину> 1, это то же самое, что получить все ненулевые списки после удаления первого элемента. Так что используйте фильтр, который проверяет каждый элемент отдельно (поэтому вам не нужно map), и создайте функцию, которая либо проверяет один список на длину> 1, либо его подсписок на ноль:

-- Use the O(n) length for your filter
u = filter ((> 1) . length) y

-- Or use an O(1) drop + null test
u' = filter (not . null . drop 1) y

Без использования композиции функций (.) эти функции:

u = filter (\sublist -> length (sublist) > 1) y

u' = filter (\sublist -> not (null (drop 1 sublist))) y
1 голос
/ 17 апреля 2011

Компилятор говорит вам, что map length y > 1 является логическим значением, но filter хочет, чтобы там была функция. Я не уверен, что вы действительно хотите сделать с y, укажите, что вы ожидаете для разных значений y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...