Real World Haskell
実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan, John Goerzen, Don Stewart(著)
山下 伸夫, 伊東 勝利
株式会社タイムインターメディア(翻訳)
開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- プログラミング言語: Haskell (純粋関数型)
Real World Haskell』(Bryan O'Sullivan、John Goerzen、Don 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 コメント:
コメントを投稿