実践Haskell HaskellのエラーとEither型 Data.Charモジュール、isDigit
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON 38(HaskellのエラーとEither型)、38.5(練習問題)Q38-1の解答を求めてみる。
コード
lesson/app/Main.hs
module Main (main) where
import Lib
( addStrInts,
)
strInts :: [String]
strInts = ["abc", "23", "456"]
main :: IO ()
main =
mapM_
( \(a, b) ->
print $
mconcat
[ a,
" + ",
b,
" = ",
show $ addStrInts a b
]
)
$ (,) <$> strInts <*> strInts
lesson/src/Lib.hs
module Lib
( addStrInts,
)
where
import Data.Char (isDigit)
isDigits :: String -> Bool
isDigits = all ((== True) . isDigit)
addStrInts :: String -> String -> Either String Int
addStrInts x y
| not (isDigits x) = Left "1つ目の引数が解析できない。"
| not (isDigits y) = Left "2つ目の引数が解析できない。"
| otherwise = Right $ read x + read y
入出力結果(Terminal, Zsh)
% stack exec lesson-exe
"abc + abc = Left \"1\\12388\\30446\\12398\\24341\\25968\\12364\\35299\\26512\\12391\\12365\\12394\\12356\\12290\""
"abc + 23 = Left \"1\\12388\\30446\\12398\\24341\\25968\\12364\\35299\\26512\\12391\\12365\\12394\\12356\\12290\""
"abc + 456 = Left \"1\\12388\\30446\\12398\\24341\\25968\\12364\\35299\\26512\\12391\\12365\\12394\\12356\\12290\""
"23 + abc = Left \"2\\12388\\30446\\12398\\24341\\25968\\12364\\35299\\26512\\12391\\12365\\12394\\12356\\12290\""
"23 + 23 = Right 46"
"23 + 456 = Right 479"
"456 + abc = Left \"2\\12388\\30446\\12398\\24341\\25968\\12364\\35299\\26512\\12391\\12365\\12394\\12356\\12290\""
"456 + 23 = Right 479"
"456 + 456 = Right 912"
%