Как использовать оператор filter like if then else в списке?

#parsing #haskell

#Синтаксический анализ #haskell

Вопрос:

я хотел бы добавить 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
  

Сбой, загруженные модули: отсутствуют.

Ответ №1:

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

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

 -- 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
  

Ответ №2:

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

Комментарии:

1. я ожидаю выбрать список, длина списка которого> 1