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でも作った方がましだとは思うが、練習なので。