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

|
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
,我为passed6ѭ传递了不同的元素 分组后,用于添加他们的头
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就像一个哈希表,似乎它不能按第二个元素分组
已邀请:
一个问题是
zip toInt(map q) (map last q)
并没有像您想象的那样被解析。 与具有C样式语法的语言不同,haskell将上述内容解析为
 zip toInt (map head q) (map last q)
(请注意空格)。 也就是说,它并未按照您希望的方式对applying14ѭ的结果应用
toInt
。相反,它正在尝试执行
zip toInt (map head q)
,这将给您键入错误,因为您正在压缩函数和列表。 您想要的是
 zip (toInt (map head q)) (map last q)
或更简洁
 zip (toInt $ map head q) (map last q)
至于第二个问题,语法也有类似的问题。另外,
groupBy
的第一个参数需要是一个确定相等性的函数,以创建组。

要回复问题请先登录注册