私はhaskellでエラーケースを処理する方法をよりよく理解しようとしており、それを支援するためにいくつかのコードを作成しました。
複数の選択肢(ネストされた大文字小文字の表現など)を処理するためのより良い方法(よりエレガントで、より短く、より一般的)はありますか?トピックに関する素晴らしいチュートリアルはありますか?
この例のメイクアップタイプ。ほとんどの場合、これらのネストされたタイプだけでなく、順次取得できる依存値があるため、これは少し単純化されています(たとえば、stdinからIDを読み取り、データベースからこのIDのレコードを取得します)。したがって、ここでのネストは、外部値がすでにチェックされている場合にのみ内部値が使用可能になる場合を示す必要がありますNothing
。より良い例については、私の新しい質問を参照してください。
type MyType = (Maybe (Maybe Int))
目標
10未満の場合はintを返し、それ以外の場合(10以上、NothingまたはJust Nothing)は異なるエラーメッセージを返します。
process Nothing ~> "error"
process (Just Nothing) ~> "error2"
process (Just (Just 20)) ~> "error3"
process (Just (Just 5)) ~> "5"
これまでに試しました:
ナイーブな実装。
「忍び寄るくぼみ」に苦しむ
process :: MyType -> String
process t = case t of
Nothing -> "error"
Just a -> case a of
Nothing -> "error2"
Just b -> if b < 10 then show b else "error3"
多分機能
多分関数を使用すると、短くなりますが、読みにくくなります。
process2 :: MyType -> String
process2 t = maybe "error" (\a -> maybe "error2" (\b -> if b < 10 then show b else "error3") a) t
パターンマッチング
これまでで最も優れたソリューションですが、より複雑なケースでは不可能です(MyTypeのタイプ定義の上のコメントを参照してください)。
process3 :: MyType -> String
process3 Nothing = "error"
process3 (Just Nothing) = "error2"
process3 (Just (Just a))
| a < 10 = show a
| otherwise = "error3"