我是Haskell的新手,我想知道合并任意数量项目的任意数量列表的最有效方法。以下是示例数据:
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请注意,列表都是以人为导向的,可能按日期排序,也可能不按日期排序,结果需要合并先前的列表,分组并创建一个列表,其中甜点是唯一的,但包含吃它的组成人员的列表,按日期倒序排序。
发布于 2014-03-30 18:03:12
解决问题最有效的方法是什么,在大多数情况下,我认为在haskell或其他编程语言中都无法回答。
一个更好的方法是思考,我如何才能解决这个问题,并在你的脑海中保留一些原则。
也许我忘记了什么,但对于你的问题,我想给出一个hintlist
如果我事先知道所有的项和名称,我就会使用代数数据类型来模拟这种情况
data Name = Mark | Chris ...
deriving (Ord,Eq,Show)
data Items = Pie | Cookies ...
deriving (Ord,Eq,Show)如果我还不知道haskell如何表示日期数据类型,我可以使用一个普通的旧String来建模,或者我会使用hoogle来查看是否已经存在日期类型。
> hoogle date
...
Data.Time.Calendar...
...所以我猜Data.Time.Calendar模块似乎是一个很好的选择,我会查看它的文档,这些文档可以在online中找到,或者如果你在本地安装软件包,你可以使用haddock从源文件中自己生成它。
下一步我要做的就是对“数据库”进行建模。当然,对于使用代数数据类型而不是数据库后端的数据库,有一些库可以用来处理sqly内容或acid状态。但为了更好地掌握haskell,我会尝试重新发明一次轮子,使用tupels列表,或者是一个类似字典的集合,在haskell中称为Map。但使用Map one时必须小心,并进行限定导入,因为它提供的大多数函数都会导致与标准库(前导)中的函数发生名称冲突。
import qualified Map as M为了对我的数据库建模,我将使用项作为键,使用日期元组和名称列表作为值,并且我想知道这是我的数据库,我将为其提供一个类型别名。
type DB = M.Map Item (Date, [Name])为了解决这个问题,我会再次浏览一下Map文档,很高兴能找到函数insertWith、empty和toList。对于insertWith函数,我会考虑混合使用max和list cons (:)函数来创建新条目。为了更好地理解整个过程,我会启动ghci和import qualified Data.Map as M,并使用M.Map String (String,[Int])或其他工具胡乱编写一些示例,以便对数据进行初步建模。
对于结果,我必须按日期对地图的toList进行排序,这只是一个小问题。我的toList myDb的类型是[(Item,(Date,[Name]))],所以使用sortBy对fst.snd进行排序应该会得到所需的结果。
在我做了这么多之后,我会休息一下,阅读一些关于解析器的东西--让我的所有文件都与我的程序联系起来。用你最不信任的搜索引擎搜索一下,会找到一些值得一读的文章(Parser Parsec Haskell)。如果所有这些都太复杂了,我会回去把我所有的类型都改为Strings,并希望在我有时间再读一遍解析器之前不要有任何类型;-)。
对于中间步骤中的任何问题,这里的人都会很乐意帮助你,假设你提供了一个具体的问题/问题描述。
如果所有这些性能还不够好,haskell提供的分析工具可以很好地帮助我,但这是我最后要解决的问题。
https://stackoverflow.com/questions/22729402
复制相似问题