RealWorldHaskell pp102(2) Answer
なぜかオーバーフローに対応したものが見当たらなかったので晒し上げ。
import Data.Char(digitToInt, isNumber) asInt_fold :: String -> Int asInt_fold [] = error "error" asInt_fold ('-':xs) = -1 * asInt_fold xs asInt_fold xs = foldl step 0 xs where step acc x | isNumber x = let acc' = toInteger acc x' = toInteger (digitToInt x) ans = acc' * 10 + x' in if ans < (toInteger (minBound::Int)) || ans > (toInteger else fromInteger ans | otherwise = error "error"
Integerに変換しては戻しとやっているので割とひどい。
これならasInteger_foldでも作った方がましだとは思うが、練習なので。