入門Haskell Monad型クラス HaskellのエラーとEither型 Either型 数値文字列、変換、和
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON38(HaskellのエラーとEither型)、38.5(練習問題)Q38-1の解答を求めてみる。
コード
app/Main.hs
module Main where
import Lib
strInts = ["2", "5", "abcde"]
main :: IO ()
main = do
print strInts
mapM_ printResult $ addStrInts <$> strInts <*> strInts
コード
src/Lib.hs
module Lib
( addStrInts,
printResult,
)
where
import Data.Char (isDigit)
isInt :: String -> Bool
isInt = all isDigit
addStrInts :: String -> String -> Either String Int
addStrInts x y
| not (isInt x) = Left $ mconcat ["1つめの引数が解析できない。", x]
| not (isInt y) = Left $ mconcat ["2つめの引数が解析できない。", y]
| otherwise = Right $ read x + read y
printResult :: Either String Int -> IO ()
printResult (Left x) = putStrLn x
printResult (Right n) = print n
入出力結果(Terminal, Zsh)
% stack build
strints-0.1.0.0: unregistering (local file changes: app/Main.hs)
strints> build (lib + exe)
Preprocessing library for strints-0.1.0.0..
Building library for strints-0.1.0.0..
Preprocessing executable 'strints-exe' for strints-0.1.0.0..
Building executable 'strints-exe' for strints-0.1.0.0..
[2 of 2] Compiling Main
Linking .stack-work/dist/x86_64-osx/Cabal-3.4.1.0/build/strints-exe/strints-exe ...
strints> copy/register
Installing library in /Users/…/strints/.stack-work/install/x86_64-osx/e8aa255f05230c729a6925540310c5d25fa2ee7edb295ecd65b1d55a14d8280b/9.0.2/lib/x86_64-osx-ghc-9.0.2/strints-0.1.0.0-1jYa8hJQgm75Emcop25CED
Installing executable strints-exe in /Users/…/strints/.stack-work/install/x86_64-osx/e8aa255f05230c729a6925540310c5d25fa2ee7edb295ecd65b1d55a14d8280b/9.0.2/bin
Registering library for strints-0.1.0.0..
% stack exec strints-exe
["2","5","abcde"]
4
7
2つめの引数が解析できない。abcde
7
10
2つめの引数が解析できない。abcde
1つめの引数が解析できない。abcde
1つめの引数が解析できない。abcde
1つめの引数が解析できない。abcde
%