Использование типа Int или Интегрального ограничения.Преимущество? - PullRequest
3 голосов
/ 13 октября 2010

Рассмотрим эти (более или менее) сигнатуры эквивалентных типов:

f1 :: [a] -> Int -> a
f2 :: Integral b => [a] -> b -> a

f2 является более общим, чем f1 , и это большое преимущество, но есть ли преимущество f1 перед f2

Похоже, что в решениях проблем H-99 и во многих опубликованных решениях различных задач Project Euler форма f1 появляется гораздо чаще, чем f2 .

Я не уверен почему. Это просто программистская лень или затраты на работу с более общей версией ( f2 ), или есть другая причина?

1 Ответ

8 голосов
/ 13 октября 2010
  • Часто это происходит из-за людей, желающих использовать интеграл в сочетании с результатами из length и другими функциями, уже ограниченными Int.Хотя часто существуют generic* функции, такие как genericLength, эти имена длиннее и не входят в Prelude.

  • Производительность Int легче понять.Производительность для Integral a во многом зависит от того, специализируется ли функция для конкретного экземпляра Integral.

  • Int, часто не только достаточно, но и честно.Например, строгие ByteString s не могут превышать Int (как правило, не комментируйте эзотерические примеры), если ваш компилятор использует машинное слово или больше Int s, а не проклятый стандарт 29+ бит .

  • Чрезмерное использование классов типов портит сигнатуры, делая язык менее читабельным.Если бы экстремальные обобщения стали обычным явлением, особенно для примитивных функций, я думаю, нам нужно было бы найти более краткий способ выразить ограничения, чтобы не сводить программистов с ума.

...