2014-10-21 2 views
5

Я пытаюсь вернуть длину списка как тип Integer, но применение length xs возвращает длину как тип Int. Как я могу обойти эту проблему?Как вернуть длину списка как тип Integer вместо Int в Haskell

Это то, что я пытаюсь достичь: (не работает)

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

Он работает, как только я меняю возвращение к sizeList :: [Integer] -> Int, но я не хочу, чтобы сделать это.

+0

идти с 'genericLength', как сказал Себастьян, или переопределить длину как упражнение: D – Carsten

+2

Надеюсь, вы хорошо знаете, хорошо ли это? Как правило, это не _possible_, чтобы иметь список так долго, что вы не можете сосчитать его длину в 'Int' - причина в том, что память компьютера в основном индексируется с помощью ints, поэтому архитектура с достаточной памятью обычно имеет достаточно большие значения для измерения любой список. В 64-битной платформе, считая до переполнения [требуется возраст] (http://www.wolframalpha.com/input/?i=2^64+%2F+3GHz), даже если вы используете бесконечный список. Вот почему стандартная функция 'length', IMO по праву, возвращает' Int' не 'Integer'. – leftaroundabout

+0

И на 32-битной пластине, это займет 1,4 секунды, но в этот момент вы будете использовать (2^32 * 8 байт ~ 34 ГБ). – Zeta

ответ

13

Вы можете позвонить по телефону genericLength из Data.List или позвонить по телефону length и использовать fromIntegral для преобразования результата.

+0

Обратите внимание, что 'genericLength' избегает возможного числового переполнения —, хотя если ваш список _that_ большой, вы, вероятно, что-то не так ... – MathematicalOrchid