2016-06-20 10 views
2

Ich habe versucht, eine Zahl im Binärformat zu drucken, und die Funktion fand ich istVerwirrung mit showIntAtBase Unterschrift

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

aber ich verstehe nicht, wie es funktioniert, vor allem weiß ich nicht, was ist der Zweck der Funktionsparameter konvertiert von Int zu Char. Intuitiv sollte diese Funktion nur zwei Parameter übernehmen, um die Nummer zu zeigen, und eine Basis, sie zeigen in, und dies scheint der Fall in spezifischere Funktionen von Numeric zu sein, wie

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

oder

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

Also was ist der Zweck der (Int -> Char) Parameter in showIntAtBase?

+1

Blick in die Dokumentation [hier] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Numeric.html#v:showIntAtBase), die ich gefunden [ hier] (https://www.haskell.org/hoogle/?hoogle=showintatbase) – pdexter

Antwort

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 

Beachten Sie, dass !! sollte nicht für ernsthafte Anwendungen verwendet werden, ist es ineffizient. Besser nutzen so etwas wie

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

'ord' und' chr' scheinen passender zu sein, irgendein Punkt, der 'vonEnum' /' toEnum' bevorzugt? – pdexter

+0

@pdexter ist nicht wirklich wichtig IMO ... sie sind gleichwertig, und ich denke, GHC wird sie auf identischen Code umschreiben. Ich finde 'ord' /' chr' ein wenig sinnlos. – leftaroundabout