业余 haskell 爱好者, 扩展 intToDigit 函数时,不知道怎么写比较好,求大佬们指教
module Main where
import Control.Monad.Reader ( runReader, MonadReader(ask), Reader )
import Data.Bifunctor ( Bifunctor(bimap) )
import Data.Char ( intToDigit, toUpper )
main :: IO ()
main = do
[n, r {- R -}] <- fmap read . words <$> getLine
putStrLn . shows n . showChar '=' $ (reverse $ runReader (calc n) r) ++ (showString "(base" . shows r $ ")")
calc :: Int -> Reader Int String
calc num = do
base <- ask
let ori@(_, mod') = divMod num base
(div'', mod'') = (if mod' < 0 then bimap (+ 1) (subtract base) else id) ori
fmap ((myIntToDigit mod'') :) (if div'' /= 0 then calc div'' else return [])
myIntToDigit :: Int -> Char
myIntToDigit n
| n >= 0 && n < 16 = toUpper . intToDigit $ n
| n >= 16 && n < 20 = toEnum (fromEnum 'A' + n - 10)
| otherwise = error . showString "myIntToDigit: unexpected input " . shows n $ ", should be between 2 and 19 inclusive"