計算機科学のブログ

実践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が解析できない。
どちらの引数も解析できない。
%