【发布时间】:2016-09-27 19:56:49
【问题描述】:
短版:
我想对一个列表进行排序,然后对排序后的列表执行过滤/提取数据以形成一个新列表的操作,这一切都在一个函数中。
长版:
我正在使用 these lessons 自学 Haskell。我目前在Homework 2练习5。
我需要编写一个函数whatWentWrong,它接受一个未排序 LogMessages 列表并返回一个字符串列表。字符串是用Error构造的LogMessage的String部分,其中Error代码> 50。它们应该按LogMessage的TimeStamp部分排序。
我有一个为 whatWentWrong 编写的函数,它可以工作,但它真的很慢(你会明白为什么)。
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong [] = []
whatWentWrong ys@((LogMessage (Error code) _ msg):xs)
| ys /= inOrder (build ys)
= whatWentWrong (inOrder (build ys))
| code > 50
= [msg] ++ whatWentWrong xs
| otherwise
= whatWentWrong xs
whatWentWrong (_:xs) = [] ++ whatWentWrong xs
函数inOrder (build x) 将返回 x 的排序版本(其中 x 是 LogMessage 列表)。显然,我必须在使用whatWentWrong 开始处理列表之前对列表进行排序,或者我必须过滤掉所有不相关的消息(不是错误或错误代码不超过 50 的消息),排序,然后抓住每一根弦。
如果我不遵循这个例子,我会定义另一个函数或其他东西,或者只是发送whatWentWrong 一个已经排序的列表。但我想这样做是有原因的(我想不通)。
不管怎样,我做了什么,为什么程序这么慢是这样的:
ys /= inOrder (build ys) 行正在检查 LogMessage 列表是否已排序每次遇到与错误模式匹配的 LogMessage 时,即使在第一次检查失败后,列表已排序好.
这是我能想到的唯一方法。真的,我想对它进行一次排序,但我不知道如何使用我的排序函数使函数对列表进行排序,然后不再执行该步骤。我显然没有正确考虑这一点,任何帮助表示赞赏。谢谢。
【问题讨论】: