Jo0*_*0o0 0 zip haskell 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
Run Code Online (Sandbox Code Playgroud)
为了
zip toInt(map head q) (map last q)
Run Code Online (Sandbox Code Playgroud)
我想在将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")]
Run Code Online (Sandbox Code Playgroud)
但是上面不能,而且我注意到的是,这()不是[]
2.如何groupBy在列表上写,我已经通过了groupBy
分组后的不同元素,它是为了添加他们的头
groupBy (nub(map tail q)) q
Run Code Online (Sandbox Code Playgroud)
: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就像一个哈希表,似乎它不能按第二个元素分组
一个问题是zip toInt(map q) (map last q)没有按照你认为的方式解析.
与具有C风格语法的语言不同,haskell将上述解析为
zip toInt (map head q) (map last q)
Run Code Online (Sandbox Code Playgroud)
(注意空格).
也就是说,它不适toInt用于map head q你想要它的结果.相反,它正在尝试这样做zip toInt (map head q),这会给你一个类型错误,因为你正在压缩一个函数和一个列表.
你想要的是
zip (toInt (map head q)) (map last q)
Run Code Online (Sandbox Code Playgroud)
或者稍微简洁一些
zip (toInt $ map head q) (map last q)
Run Code Online (Sandbox Code Playgroud)
至于你的第二个问题,你在语法方面遇到了类似的问题.此外,第一个参数groupBy需要是一个函数,用于确定创建组的目的的相等性.