haskell求讨论
查看原帖
haskell求讨论
625398
_OTZ_楼主2024/10/26 21:42

业余 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"

2024/10/26 21:42
加载中...