0
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在一个列表上,我已经通过了distinct elements forgroupBy 分组后,是为了添加他们的头部

groupBy (nub(map tail q)) q

:1:10: 无法匹配预期类型a0 -> a0 -> Bool' with actual type[a1]' 在nub' In the first argument ofgroupBy' 的调用的返回类型中,即 `(nub (map tail q))' 在表达式中:groupBy (nub (map tail q)) q

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

4

1 回答 1

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需要是一个确定相等性以创建组的函数。

于 2011-04-19T13:27:41.903 回答