計算機科学のブログ

実践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"
%