首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并N个列表、跟踪重复项并按日期排序的最有效方法

合并N个列表、跟踪重复项并按日期排序的最有效方法
EN

Stack Overflow用户
提问于 2014-03-29 17:40:57
回答 1查看 98关注 0票数 0

我是Haskell的新手,我想知道合并任意数量项目的任意数量列表的最有效方法。以下是示例数据:

代码语言:javascript
复制
LIST 1: steve
2014-01-20 | cookies  | steve

LIST 2: chris
2014-02-05 | cookies  | chris

LIST 3: mark
2014-09-30 | brownies | mark
2014-03-30 | candy    | mark
2014-05-12 | pie      | mark

LIST 4: anthony
2014-05-18 | cookies  | anthony
2013-12-25 | fudge    | anthony

LIST 5: andy
2014-10-04 | cookies  | andy

LIST 7: john
2014-06-19 | pie      | john


RESULTING LIST
2014-10-04 | cookies  | andy chris steve anthony
2014-09-30 | brownies | mark
2014-06-19 | pie      | john mark
2014-03-30 | candy    | mark
2013-12-25 | fudge    | anthony

请注意,列表都是以人为导向的,可能按日期排序,也可能不按日期排序,结果需要合并先前的列表,分组并创建一个列表,其中甜点是唯一的,但包含吃它的组成人员的列表,按日期倒序排序。

EN

回答 1

Stack Overflow用户

发布于 2014-03-30 18:03:12

解决问题最有效的方法是什么,在大多数情况下,我认为在haskell或其他编程语言中都无法回答。

一个更好的方法是思考,我如何才能解决这个问题,并在你的脑海中保留一些原则。

  • testability
  • abstraction和expressiveness
  • maintainability
  • readability
  • performance

也许我忘记了什么,但对于你的问题,我想给出一个hintlist

如果我事先知道所有的项和名称,我就会使用代数数据类型来模拟这种情况

代码语言:javascript
复制
data Name  = Mark | Chris ...
           deriving (Ord,Eq,Show)
data Items = Pie | Cookies ...
           deriving (Ord,Eq,Show)

如果我还不知道haskell如何表示日期数据类型,我可以使用一个普通的旧String来建模,或者我会使用hoogle来查看是否已经存在日期类型。

代码语言:javascript
复制
> hoogle date
...
Data.Time.Calendar...
...

所以我猜Data.Time.Calendar模块似乎是一个很好的选择,我会查看它的文档,这些文档可以在online中找到,或者如果你在本地安装软件包,你可以使用haddock从源文件中自己生成它。

下一步我要做的就是对“数据库”进行建模。当然,对于使用代数数据类型而不是数据库后端的数据库,有一些库可以用来处理sqly内容或acid状态。但为了更好地掌握haskell,我会尝试重新发明一次轮子,使用tupels列表,或者是一个类似字典的集合,在haskell中称为Map。但使用Map one时必须小心,并进行限定导入,因为它提供的大多数函数都会导致与标准库(前导)中的函数发生名称冲突。

代码语言:javascript
复制
import qualified Map as M

为了对我的数据库建模,我将使用项作为键,使用日期元组和名称列表作为值,并且我想知道这是我的数据库,我将为其提供一个类型别名。

代码语言:javascript
复制
type DB = M.Map Item (Date, [Name])

为了解决这个问题,我会再次浏览一下Map文档,很高兴能找到函数insertWithemptytoList。对于insertWith函数,我会考虑混合使用max和list cons (:)函数来创建新条目。为了更好地理解整个过程,我会启动ghciimport qualified Data.Map as M,并使用M.Map String (String,[Int])或其他工具胡乱编写一些示例,以便对数据进行初步建模。

对于结果,我必须按日期对地图的toList进行排序,这只是一个小问题。我的toList myDb的类型是[(Item,(Date,[Name]))],所以使用sortByfst.snd进行排序应该会得到所需的结果。

在我做了这么多之后,我会休息一下,阅读一些关于解析器的东西--让我的所有文件都与我的程序联系起来。用你最不信任的搜索引擎搜索一下,会找到一些值得一读的文章(Parser Parsec Haskell)。如果所有这些都太复杂了,我会回去把我所有的类型都改为Strings,并希望在我有时间再读一遍解析器之前不要有任何类型;-)。

对于中间步骤中的任何问题,这里的人都会很乐意帮助你,假设你提供了一个具体的问题/问题描述。

如果所有这些性能还不够好,haskell提供的分析工具可以很好地帮助我,但这是我最后要解决的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22729402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档