2017-05-11 3 views

Antwort

5

Es gibt keine 0000 vom Typ Int, die sich von 0 unterscheidet, dies ist also nicht möglich. Dies ist nicht spezifisch für Haskell: Sie sehen dasselbe in jeder anderen Sprache mit numerischen Typen (d. H. Im Grunde jede Sprache überhaupt).

Aber wenn Sie sagen, „das Ergebnis 0 ist“, sollte man mehr sagen richtig, dass Ergebnis wird als gedruckt 0, und in der Regel werden Sie Funktionen haben, die Sie erlauben, den gleichen Wert wie 0000, zu drucken, aber wieder gewonnen‘ t zwischen 0 und 0000 ganzzahligen Werten unterscheiden.

Wenn Sie diese Informationen beibehalten möchten, benötigen Sie einen anderen Typ. Welcher, hängt davon ab, was genau du brauchst. Z.B. es könnte

data Digits = Digits [Int] 

sein, wobei jedes Element der Liste von 0 zu 9 (oder [Int] direkt verwenden). Oder

data IntWithPaddingZeros = IntWithPaddingZeros { value :: Int, paddingZeros :: Int } 

Etc.

2

Sie müssen einen neuen Datentyp wie MyInt definieren oder Mint sagen und dem Compiler sagen, wie es angezeigt werden soll.

data Mint = M Int 
instance Show Mint where 
    show (M n) = "000" ++ show n 

*Main> M 7 
0007 

Dies ist natürlich ein sehr einfaches Beispiel. Sie könnten eine konzeptuellere Zeigefunktion entwickeln, die die Anzahl der hinzuzufügenden Nullen ableiten könnte, wenn die Ganzzahl mehr als 1 Ziffer ist.

OK wir unsere Darstellung Funktion entwickeln ein wenig weiter ...

data Mint = M Int 
instance Show Mint where 
    show (M n) = replicate (3 - (round . (logBase 10) . fromIntegral) n) '0' ++ show n 

*Main> M 133 
0133 
*Main> M 22 
0022 
*Main> M 0 
0000 
*Main> M 1453 
1453