2016-09-27 9 views
2

ショートバージョンのものを実行します。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] 

リストがソートされているかどうかを確認するために、リストをソートしている場合は、あなたにもちょうどソートされたリスト上で直接動作することがあります。

答えて

3

は、あなたは本当にただ1行のリストの理解を必要とします。これを済ませたら、リスト内包はパターンマッチしない要素を自動的にフィルタリングし、code > 50は残りの部分をフィルタリングします。


あなたは運動としてあなたの現在のコードを修正したい場合は、単にその入力がソートされていると仮定ヘルパー関数を定義する必要があります。

whatWentWrong :: [LogMessage] -> [String] 
whatWentWrong ys = www (inOrder (build ys)) 
        where www [] = [] 
         www ((LogMessage (Error code) _ msg):xs) | code > 50 = msg : www xs 
                    | otherwise = www xs 
         www (_:xs) = www xs 

ただし、wwwmapfilterの組み合わせであることを認識すべきです。

whatWentWrong ys = map f $ filter p (inOrder (build ys)) 
        where p (LogMessage (Error code) _ _) = code > 50 
         p _ = False 
         f (LogMessage _ _ msg) = msg 

や、ポイントフリースタイルで

whatWentWrong = map f . filter p . inOrder . build 
       where p (LogMessage (Error code) _ _) = code > 50 
         p _ = False 
         f (LogMessage _ _ msg) = msg 
+0

うわー、それはとても簡単です。私は理解をまだ列挙していないが、もし私にこの権利があるかどうか教えてください。これは、ソートされたリスト 'xs'の各要素に対する' msg'のリストをLogMessageのパターンと一致させ、 'code> '。それは私の機能に比べても驚くほど速いです。 – chiiidog

+0

そうです。パターンマッチは 'Info'と' Warning'メッセージをフィルタリングし、ガードは低い番号のエラーをフィルタリングします。 – chepner

関連する問題