私はHaskellの初心者です。エラー処理のためにEitherを使用するいくつかのHaskellコードに取り組んでいます。 Eitherの左の要素はエラーを表し、右の要素は正常な結果を表します。コードでは、このユースケース用に設計されているような、Applitherative of Eitherを使用することがよくあります。Eithersのリストをリストに変換する
タイプ[Either e r]
のオブジェクトが与えられた場合、それをタイプEither e [r]
のオブジェクトに変換する最もエレガントな方法は何ですか?これは、呼び出された関数からの戻り値の配列を持つ可能性があり、それらの戻り値のいずれかがエラーであれば、そのエラーを取得して他のものをすべて破棄したいと考えています。配列の複数の要素にエラーがある場合は、できるだけ一番左のエラーを取得することをお勧めします。
次のコードでは、2つの関数を記述することでこの問題を解決できましたが、そのうちの1つは再帰的ですが、より良い方法がありますか? Control.Monad
から
type Error = [Char]
myFunc :: [Either Error a] -> Either Error [a]
myFunc = myFunc2 []
myFunc2 :: [a] -> [Either Error a] -> Either Error [a]
myFunc2 r ((Left error):rest) = Left error
myFunc2 r ((Right item):rest) = myFunc2 (r ++ [item]) rest
myFunc2 r [] = Right r
main :: IO()
main = do
-- This prints: Right [1, 2, 3]
putStrLn (show (myFunc [Right 1, Right 2, Right 3]))
-- This prints: Left "division by zero"
putStrLn (show (myFunc [Right 1, Left "division by zero", Right 3]))
のsequenceAあなたはと呼ばれる便利なサイトがあります、それを認識していませんよ[Hoogle](https://www.haskell.org/hoogle/)ここでタイプを入力できますあなたが見たいと思っている関数のシグネチャと一致/類似のシグネチャを持つ関数の提案を与えるでしょう。悲しいことに、[[lr]]→[l [r] 'は結果をもたらしていないようです:( – paul