2014-10-21 12 views
5

Próbuję zwrócić długość listy jako typ Integer, ale zastosowanie length xs zwraca długość jako typ Int. Jak mogę obejść ten problem?Jak zwrócić długość listy jako typ Integer zamiast Int w Haskell

To co próbuję osiągnąć: (nie działa)

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

Działa on jak najszybciej zmienić powrót do sizeList :: [Integer] -> Int ale nie chcę, aby to zrobić.

+0

Przejdź z "genericLength", jak powiedział Sebastian - lub uzupełnij długość jako ćwiczenie: D – Carsten

+2

Mam nadzieję, że dobrze się zastanawiasz, czy to dobry pomysł? Zwykle nie jest możliwe, aby mieć listę tak długo, że nie można policzyć jej długości w 'Int' - powodem jest to, że pamięć komputera jest w zasadzie indeksowana przez ints, więc architektura z wystarczającą pamięcią będzie na ogół wystarczająco duża, aby zmierzyć dowolna lista. Na 64-bitowej platformie, liczenie aż do przepełnienia [trwa wieki] (mimo to, http://www.wolframalpha.com/input/?i=2^64+%2F+3GHz), nawet jeśli korzystasz z nieskończonej listy. Dlatego standardowa funkcja 'length', słusznie IMO, zwraca' Int' not' Integer'. – leftaroundabout

+0

I na 32-bitowej plattform, zajmie to 1,4 sekundy, ale w tym momencie używałbyś (2^32 * 8 bajtów ~ 34 GB). – Zeta

Odpowiedz

13

Możesz zadzwonić pod numer genericLength od Data.List lub zadzwonić pod numer length i użyć fromIntegral, aby przekonwertować wynik.

+0

Zauważ, że 'rodzajLength' pozwala uniknąć możliwego przelewu liczbowego —, ale jeśli twoja lista jest duża, prawdopodobnie robisz coś złego ... – MathematicalOrchid

Powiązane problemy