2014-10-21 7 views
5

Ich versuche, die Länge einer Liste als Integer Typ zurückzugeben, aber die Anwendung length xs gibt die Länge als Int Typ zurück. Wie kann ich dieses Problem umgehen? DieseSo geben Sie die Länge einer Liste als Typ Integer anstelle von Int in Haskell zurück

ist, was ich versuche zu erreichen: (es funktioniert nicht)

sizeList :: [Integer] -> Integer 
sizeList xs = length xs 

Es funktioniert, sobald ich die Rückkehr zu sizeList :: [Integer] -> Int ändern, aber ich will nicht, dies zu tun.

+0

gehen Sie mit 'genericLength' wie Sebastian sagte - oder Länge als Übung neu zu implementieren: D – Carsten

+2

Ich hoffe, Sie haben aber gut darüber, ob das eine gute Idee ist? Normalerweise ist es nicht möglich, eine Liste zu haben, solange man die Länge nicht in 'Int' zählen kann. Der Grund dafür ist, dass der Speicher des Computers grundsätzlich mit Ints indiziert ist irgendeine Liste. Auf einer 64-Bit-Plattform zählt das Zählen bis zum Überlauf (http://www.wolframalpha.com/input/?i=2^64+%2F+3GHz) sowieso, auch wenn Sie eine unendliche Liste verwenden. Deshalb gibt die Standard-Funktion 'length' IMO zu Recht' Int' und nicht 'Integer' zurück. – leftaroundabout

+0

Und auf einer 32-Bit-Plattform dauert es 1,4 Sekunden, aber an diesem Punkt würden Sie verwenden (2^32 * 8 Byte ~ 34 GB). – Zeta

Antwort

13

Sie können entweder genericLength von Data.List anrufen oder length anrufen und fromIntegral verwenden, um das Ergebnis zu konvertieren.

+0

Beachten Sie, dass GenericLength einen möglichen numerischen Überlauf vermeidet — obwohl wenn Ihre Liste _that_ big ist, Sie wahrscheinlich etwas falsch machen ... – MathematicalOrchid

Verwandte Themen