如何在实际操作中使用groupBy和zip?

时间:2011-04-19 12:22:14

标签: haskell zip combinators

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)

我想在将head转换为整数后将头部添加回尾部 结果应为[[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(map tail q))q

q就像一个哈希表,似乎它不能按第二个元素分组

1 个答案:

答案 0 :(得分:5)

一个问题是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的第一个参数需要是一个为创建组而确定相等性的函数。