How to print integer literals in binary or hex in haskell?

前端 未结 8 1203
说谎
说谎 2021-01-30 02:13

How to print integer literals in binary or hex in haskell?

printBinary 5 => \"0101\"

printHex 5 => \"05\"

Which libraries/functions allo

8条回答
  •  滥情空心
    2021-01-30 02:58

    Silly solution for one-liner fans:

    (\d -> let fix f = let {x = f x} in x in fmap (\n -> "0123456789abcdef" !! n) (fix (\f l n -> if n == 0 then l :: [Int] else let (q, r) = quotRem n 16 in f (r:l) q) [] d)) 247
    

    The nucleus of the one-liner is:

    quotRem 247 16
    

    For the sake of clarity, you can, alternatively, put the following in a file:

    #!/usr/bin/env stack
    {- stack script --resolver lts-12.1 -}
    -- file: DecToHex.hs
    
    module Main where
    
    import System.Environment
    
    fix :: (a -> a) -> a
    fix f = let {x = f x} in x
    
    ff :: ([Int] -> Int -> [Int]) -> [Int] -> Int -> [Int]
    ff = \f l n ->
      if n == 0
      then l
      else
        let (q, r) = quotRem n 16
        in f (r:l) q
    
    decToHex :: Int -> String
    decToHex d =
      fmap (\n -> "0123456789abcdef" !! n)
      (fix ff [] d)
    
    main :: IO ()
    main =
      getArgs >>=
      putStrLn . show . decToHex . read . head
    

    And execute the script with:

    stack runghc -- DecToHex.hs 247
    

    I used fixed-point operator just so it is an example with fixed-point operator; also because it allowed me to construct the one-liner strictly bottom-up. (Note: bottom-up development is to be discouraged.)

    References: stack script syntax, Command line arguments, fix operator definition.

    recursion haskell hex haskell-stack

提交回复
热议问题