与my previous question相似,但现在我有一个转折!
我的数据类型如下:
data Container = Container [Double]
我希望总结一下这些婴儿的名单,如下:
sum' [Container [1,1,1], Container [2,2,2], Container [3,3,3]]
> [6,6,6]
无法弄清楚这样做的干净方法。
答案 0 :(得分:2)
为您的Container类型定义一个访问者:
content (Container x) = x
然后你可以这样做:
sum' = map sum . transpose . map content
答案 1 :(得分:2)
它类似于您收到的其他问题的答案,除非您需要从Container
中删除内部列表:
import Data.List
sum' = map sum . transpose . map ( \ (Container cs) -> cs)
答案 2 :(得分:1)
最简单的方法是在求和之前映射列表:
sum' = map (sum . (\ (Container ls) -> ls))
如果您想获得不同类型的总和,您只需将sum
函数替换为其他内容即可。
答案 3 :(得分:0)
嗯,我想我会把这个添加到你已经拥有的答案中:一种传统的方法是更喜欢记录类型定义而不是你使用的更简单的产品类型定义,因为记录类型为你提供了一个免费的访问函数。所以你要像这样定义Container
:
data Container = Container { getContents :: Double }
这将Container
定义为一个名为getContents
的字段的记录类型。与其他类型相比,这是一个有趣的字段名称,但问题是现在getContents
被定义为从Container
中提取此字段的函数:
getContents (Container [1, 2, 3]) -- result: [1.0, 2.0, 3.0]
鉴于此,你有与Grzegorz给出的答案相同的答案,但使用隐式定义的getContents
函数代替他明确定义的content
函数:
sum' = map sum . transpose . map getContents