計算機科学のブログ

入門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
%