RosettaCodeData/Task/Increment-a-numerical-string/Haskell/increment-a-numerical-strin...

31 lines
767 B
Haskell

import Text.Read (readMaybe)
import Data.Maybe (mapMaybe)
succString :: Bool -> String -> String
succString pruned s =
let succs
:: (Num a, Show a)
=> a -> Maybe String
succs = Just . show . (1 +)
go w
| elem '.' w = (readMaybe w :: Maybe Double) >>= succs
| otherwise = (readMaybe w :: Maybe Integer) >>= succs
opt w
| pruned = Nothing
| otherwise = Just w
in unwords $
mapMaybe
(\w ->
case go w of
Just s -> Just s
_ -> opt w)
(words s)
-- TEST ---------------------------------------------------
main :: IO ()
main =
(putStrLn . unlines) $
succString <$> [True, False] <*>
pure "41.0 pine martens in 1491 -1.5 mushrooms ≠ 136"