ショートバージョンのものを実行します。Haskellの機能の並べ替え入力リストは、ソートされたリストで
私は、リストをソートしたいし、新しいリストを形成するために、フィルタ/抽出データというそのソートされたリスト上で操作を実行する、オールインワン関数。
ロングバージョン:
私は自分自身がthese lessonsを使用してHaskellの教えています。私はLogMessagesのソートされていないリストを受け取り、文字列のリストを返す関数whatWentWrong
を書くために必要なのです。5.
Homework 2行使に現在です。文字列は、エラーコードが50を超えるErrorで構築されたLogMessagesのString部分です。これらは、LogMessageのTimeStamp部分でソートされていると考えられます。
私はwhatWentWrong
のために書かれた関数を持っていますが、それは実際にはとても遅いです(理由は分かります)。
whatWentWrong :: [LogMessage] -> [String]
whatWentWrong [] = []
whatWentWrong [email protected]((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はLogMessagesのリストである)は、xのソートされたバージョンを返します。明らかに、私はwhatWentWrong
で処理を開始する前にリストを並べ替えるか、関連していないすべてのメッセージ(エラーではない、または50を超えるエラーコードを持たないメッセージ)をフィルタリングして並べ替え、それぞれの文字列。
私がこの例に従わなかった場合は、別の関数や何かを定義するか、whatWentWrong
を既にソートされたリストとして送信します。しかし、私はこのようにする理由があると思います(私は理解できません)。
、そしてなぜプログラムがとても遅いのは、この次のとおりです。でも、ラインys /= inOrder (build ys)
はLogMessageにリストがそれがエラーパターンに一致するLogMessageにに遭遇毎回ソートされていることを確認している 最初にチェックが失敗した後、リストは良好にソートされます。
私がそれを行うと思う唯一の方法です。本当に、私はそれを一度ソートしたいのですが、関数をソート関数を使ってソートし、そのステップをやり直す方法がわかりません。私は明らかにこれについて正しく考えているわけではなく、どんな助けもありがたいです。ありがとう。
whatWentWrong xs = [ msg | (LogMessage (Error code) _ msg) <- inOrder (build xs), code > 50]
リストがソートされているかどうかを確認するために、リストをソートしている場合は、あなたにもちょうどソートされたリスト上で直接動作することがあります。
うわー、それはとても簡単です。私は理解をまだ列挙していないが、もし私にこの権利があるかどうか教えてください。これは、ソートされたリスト 'xs'の各要素に対する' msg'のリストをLogMessageのパターンと一致させ、 'code> '。それは私の機能に比べても驚くほど速いです。 – chiiidog
そうです。パターンマッチは 'Info'と' Warning'メッセージをフィルタリングし、ガードは低い番号のエラーをフィルタリングします。 – chepner