Haskell - 実践Haskell - HaskellのエラーとEither型 - succ, tail, lastの安全なバージョン, list
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT 7(実践Haskell)、LESSON 38(HaskellのエラーとEither型)、38.5(練習問題)、Q38-2の解答を求めてみる。
コード
sample5.hs
import Data.Char (isDigit)
main :: IO ()
main = do
print $ addStrInts "a" "b"
print $ addStrInts "a" "1"
print $ addStrInts "1" "b"
print $ addStrInts "1" "2"
print $ addStrInts "a1" "b2"
print $ addStrInts "a1" "1"
print $ addStrInts "1" "b2"
print $ addStrInts "12" "23"
addStrInts :: String -> String -> Either String Int
addStrInts x y | not (all isDigit x) = Left $ mconcat ["invaild value: ", x]
| not (all isDigit y) = Left $ mconcat ["invaild value: ", y]
| otherwise = Right $ read x + read y
入出力結果(Terminal, Zsh)
% runghc sample5.hs
Just 2
Nothing
""
""
"bcde"
Left "empty list"
Right 'e'
Left "too large"
%