与showIntAtBase签名混淆

时间:2016-06-20 11:31:04

标签: haskell

我尝试以二进制格式打印数字,我找到的函数是

showIntAtBase :: (Integral a, Show a) => a -> (Int -> Char) -> a -> ShowS 

但我不明白它的工作原理,特别是我不知道函数参数从Int转换为Char的目的是什么。直观地说,这个函数应该只需要2个参数,要显示的数字和显示它的基数,这似乎是来自Numeric的更具体函数的情况,如

showHex :: (Integral a, Show a) => a -> ShowS 

showOct :: (Integral a, Show a) => a -> ShowS 

那么(Int -> Char)中的showIntAtBase参数的用途是什么?

1 个答案:

答案 0 :(得分:3)

Prelude Numeric> putStrLn $ showIntAtBase 10 (\n -> ['0'..'9']!!n) 26734 ""
26734
Prelude Numeric> putStrLn $ showIntAtBase 10 ("⁰¹²³⁴⁵⁶⁷⁸⁹"!!) 26734 ""
²⁶⁷³⁴
Prelude Numeric> putStrLn $ showIntAtBase 16 ("0123456789ABCdef"!!) 0xbeef ""
Beef

请注意!!不应该用于严肃的应用程序,效率低下。更好地使用像

这样的东西
Prelude Numeric> let c0 = fromEnum '0' in showIntAtBase 10 (toEnum . (+c0)) 26734 ""
"26734"