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就像一个哈希表,似乎它不能按第二个元素分组
答案 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
的第一个参数需要是一个为创建组而确定相等性的函数。