【问题标题】:How to use groupBy and zip in real practice?如何在实际实践中使用 groupBy 和 zip?
【发布时间】:2011-04-19 12:22:13
【问题描述】:
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,我为groupBy 传递了不同的元素 分组后,就是为了加他们的头

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就像一个哈希表,好像不能按第二个元素分组

【问题讨论】:

  • [[1,"x^3"],[2,"x^2"],[1,"x^2"]] 在 Haskell 中是不可能的:你不能在一个列表中混合不同的类型,但是这里的内部列表同时包含 Ints 和 Strings。通常的解决方案是使用元组。另一种解决方案是异构列表,但我想这在这里太过分了。
  • 可以,结果是[(1, "a"),(2, "b")]
  • 在 Haskell 中,() 表示元组,[] 表示列表,两者本质上是不同的。如果您理解这一点,请相应地更改您的问题。

标签: haskell zip combinators


【解决方案1】:

一个问题是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 的第一个参数必须是一个确定相等性的函数,以便创建组。

【讨论】:

  • 添加括号后,我尝试第二个问题,这种写作风格可以按第二个元素分组吗?
  • 您对groupBy (nub(map tail q)) q 的问题是groupBy 接受了一个函数参数,而您没有提供它。
  • 你的意思是我应该写 groupBy (=nub(map tail q)) q
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
相关资源
最近更新 更多