実践Haskell HaskellのエラーとEither型 文字列の解析、数値、Data.Charモジュール、isDigit関数
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON 38(HaskellのエラーとEither型)、38.5(練習問題)Q38-1の解答を求めてみる。
コード
import Data.Char(isDigit)
isNumber :: String -> Bool
isNumber = all isDigit
addStrInts :: String -> String -> Either String Int
addStrInts x y
| isNumber x && isNumber y = Right (read x + read y)
| not (isNumber x) && isNumber y = Left "1つめの引数が解析できない。"
| isNumber x = Left "2つめの引数tが解析できない。"
| otherwise = Left "どちらの引数も解析できない。"
pairs :: [(String, String)]
pairs = [("12", "345"),
("a", "345"),
("12", "b"),
("a", "cd")]
p :: Either String Int -> String
p (Left x) = x
p (Right x) = show x
main :: IO ()
main = do
mapM_ (putStrLn . p . (\(x, y) -> addStrInts x y))
pairs
入出力結果(Terminal, Zsh)
% runghc sample1.hs
357
1つめの引数が解析できない。
2つめの引数tが解析できない。
どちらの引数も解析できない。
%