2013年2月17日日曜日

開発環境

Real World Haskell』(Bryan O'SullivanJohn GoerzenDon Stewart(著)、山下 伸夫伊東 勝利株式会社タイムインターメディア(翻訳)、オライリー・ジャパン、2009年、ISBN978-4-87311-423-3)の4章(関数プログラミング)の4.6(ループをどのように考えるか)の練習問題2.を解いてみる。

2.

コード(BBEdit)

Sample.hs

-- file: Sample.hs
import Data.Char (digitToInt, isDigit)

type ErrorMessage = String
asInt_either :: String -> Either ErrorMessage Int
asInt_either [] = Left "non-digit ''"
asInt_either (x:[]) 
    | x /= '-' = Left "non-digit '-'"
    | isDigit x = Right (digitToInt x)
    | otherwise = Left ("non-digit '" ++ x:"'")
asInt_either (x:xs) 
    | (x /= '-') && (all isDigit xs) = Right (step 0 (x:xs))
    | x /= '-' = Left ("non-digit '" ++ (last xs):"'")
    | all isDigit xs = Right ((-1) * (step 0 xs))
    | otherwise = Left ("non-digit '" ++ (head (dropWhile isDigit (reverse xs))):"'")
          where step n (x:xs) = let n' = 10 * n + digitToInt x
                                in step n' xs
                step n [] = n

入出力結果(Terminal)

$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load Sample.hs
[1 of 1] Compiling Main             ( Sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> asInt_either "101"
Right 101
*Main> asInt_either "-31337"
Right (-31337)
*Main> asInt_either "1798"
Right 1798
*Main> asInt_either ""
Left "non-digit ''"
*Main> asInt_either "-"
Left "non-digit '-'"
*Main> asInt_either "foo"
Left "non-digit 'o'"
*Main> :quit
Leaving GHCi.
$

0 コメント:

コメントを投稿