2011-07-09 6 views

答えて

6

あなたは、他の回答にもかかわらず、GHCでは、この使用してビューのパターンの拡張を行うことができます

getFirstError ((msum . map test) -> Just x) = x 
     where test (Left x) = Just x 
       test (Right x) = Nothing 

代わりに使用してパターンガード:

getFirstError (xs) | Just x <- (msum $ map test xs) = x 
     where test (Left x) = Just x 
       test (Right) x = Nothing 
+0

誤ってパターンガードのバージョンの 'Just'コンストラクタでのマッチを省略しましたか? – Rotsor

+0

また、妥当と思われないエラータイプの 'Monoid'インスタンスが必要です。十分な括弧がないため' test'関数はコンパイルされません。そして、最初のエラーの代わりにすべてのエラーの連結を返します。 – Rotsor

+0

'mconcatを置き換えてください。 map test - > 'xcon'を' mconcat 'で実行します。マップ(最初のテスト) - >最初(ちょうどx) 'はそのトリックを行うべきです。 – Rotsor

1

いいえ、ありません。ノー

getFirstError [] = error "getFirstError: empty list or no error" 
getFirstError (Left x : xs) = x 
getFirstError (_ : xs) = getFirstError xs 
2

ていますが、リストの内包に誤りがない場合headが失敗すること

getFirstError xs = head [ x | Left x <- xs ] 

注意を使用することができます。ただし、再帰を使用して関数を記述easiliyすることができます。

+3

と 'head'の失敗は、それ自体のエラーですさまざまな種類があるので、この関数は常にある程度のエラーを見つけることができます。 –

関連する問題