Как использовать groupBy и zip в реальной практике? - PullRequest
0 голосов
/ 19 апреля 2011
import Data.List.Split
import Data.List(nub, groupBy)

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

y = map (splitOn "*") z

x = map head y

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

u1 = filter ((< 2) . length) y
u2 = filter ((> 1) . length) y

v = map ("1" :) u1

q = u2 ++ v
q2 = zip toInt(map head q) (map last q)
q6 = groupBy nub(map tail q) q
q3 = map tail q
q5 = nub(q3)

q1 = map head q

1. Для

zip toInt(map head q) (map last q)

Я бы хотел добавить голову обратно в хвост после преобразования головы в целое число. результат должен быть [[1,"x^3"],[2,"x^2"],[1,"x^2"]]

я могу сделать

*Main Data.List> zip [2,1,1] ["x^3","x^2","x^2"]
[(2,"x^3"),(1,"x^2"),(1,"x^2")]

но выше нельзя, и есть разница, которую я заметил, это (), а не []

2. Как написать groupBy в списке, я передал различные элементы для groupBy После группировки это для добавления их головы

groupBy (nub(map tail q)) q

: 1: 10: Не удалось найти ожидаемый тип a0 -> a0 -> Bool' with actual type [a1] ' В возвращаемом типе вызова nub' In the first argument of groupBy ', а именно `(nub (map tail q))' В выражении: groupBy (nub (хвост карты)) q

q похоже на хеш-таблицу, похоже, что она не может группироваться по второму элементу

1 Ответ

5 голосов
/ 19 апреля 2011

Одна проблема в том, что zip toInt(map q) (map last q) не анализируется так, как вы думаете.

В отличие от языков с синтаксисом в стиле C, haskell анализирует вышеприведенное как

 zip toInt (map head q) (map last q)

(обратите внимание на пробел).

То есть он не применяет toInt к результату map head q так, как вы этого хотите. Вместо этого он пытается выполнить zip toInt (map head q), что приведет к ошибке типа, поскольку вы архивируете функцию и список.

Вместо этого вы хотите

 zip (toInt (map head q)) (map last q)

Или чуть более кратко

 zip (toInt $ map head q) (map last q)

Что касается вашей второй проблемы, у вас аналогичная проблема с синтаксисом. Кроме того, первый аргумент groupBy должен быть функцией, определяющей равенство для целей создания групп.

...