2016-06-20 117 views
2

我試圖以二進制格式打印數量,而且我發現功能混淆showIntAtBase簽名

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

查看文檔[這裏](http://hackage.haskell.org/package/base-4.9.0.0/docs/Numeric.html#v:showIntAtBase),我發現[這裏](https://www.haskell.org/hoogle/?hoogle=showintatbase) – pdexter

回答

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

請注意,!!不應該用於嚴重的應用程序,它效率低下。更好地使用像

Prelude Numeric> let c0 = fromEnum '0' in showIntAtBase 10 (toEnum . (+c0)) 26734 "" 
"26734" 
+0

'ord'和'chr'似乎更適合,喜歡'fromEnum' /'toEnum'的任何一點? – pdexter

+0

@pdexter並不是真正重要的IMO ......它們無論如何都是等價的,我認爲GHC會將它們重寫爲相同的代碼。我覺得'ord' /'chr'有點無用。 – leftaroundabout