リストの途中で値とパターンマッチングする方法はありますか?または最後に?
getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w
WRT Haskellのようなものが、それは面白いかもしれませんが、パターンはこれを実現一致するとどのように他の言語を知っています。
リストの途中で値とパターンマッチングする方法はありますか?または最後に?
getFirstError :: [Either a b] -> a
getFirstError (x:y:...:Left w:z) = w
WRT Haskellのようなものが、それは面白いかもしれませんが、パターンはこれを実現一致するとどのように他の言語を知っています。
あなたは、他の回答にもかかわらず、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
いいえ、ありません。ノー
getFirstError [] = error "getFirstError: empty list or no error"
getFirstError (Left x : xs) = x
getFirstError (_ : xs) = getFirstError xs
ていますが、リストの内包に誤りがない場合head
が失敗すること
getFirstError xs = head [ x | Left x <- xs ]
注意を使用することができます。ただし、再帰を使用して関数を記述easiliyすることができます。
と 'head'の失敗は、それ自体のエラーですさまざまな種類があるので、この関数は常にある程度のエラーを見つけることができます。 –
誤ってパターンガードのバージョンの 'Just'コンストラクタでのマッチを省略しましたか? – Rotsor
また、妥当と思われないエラータイプの 'Monoid'インスタンスが必要です。十分な括弧がないため' test'関数はコンパイルされません。そして、最初のエラーの代わりにすべてのエラーの連結を返します。 – Rotsor
'mconcatを置き換えてください。 map test - > 'xcon'を' mconcat 'で実行します。マップ(最初のテスト) - >最初(ちょうどx) 'はそのトリックを行うべきです。 – Rotsor