Почему функции делают Vector экземпляром Functor, Monad, Applicative, Alternative, Foldable и Traversable slow? - PullRequest
16 голосов
/ 28 сентября 2011

В журнале изменений для версии 0.8 vector перечислены следующие изменения с предупреждением:

Функтор, Монада, Аппликативный, Альтернативный, Складной и Проходной экземпляры для штучных векторов (ВНИМАНИЕ: они имеют тенденцию быть медленными и только для полноты) .

Может кто-нибудь объяснить, почему это так? Это просто обычная стоимость специализации класса типов или что-то более интересное?

Обновление: Глядя на некоторые конкретные экземпляры, можно увидеть, например:

instance Foldable.Foldable Vector where
  {-# INLINE foldr #-}
  foldr = foldr

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

Ответы [ 2 ]

15 голосов
/ 29 сентября 2011

Я отправил первоначальный набор этих экземпляров Роману полтора года назад и с тех пор сохранил векторные экземпляры.(Мне пришлось удалить эти экземпляры из векторных экземпляров, как только они мигрировали в вектор, и теперь поддерживать их исключительно для действительно экзотических вещей).Его беспокоило то, что если бы люди использовали эти экземпляры полиморфно , то ПРАВИЛА, которые заставляют Векторы слиться, не могут сработать, если полиморфная функция не будет встроена и мономорфизирована.

Они существуют, потому что не каждый биткод на планете привязан к вектору, и даже тогда иногда полезно использовать общие имена.

Здесь медленное относительное.В худшем случае они действуют как чьи-то другие фолды, привязки и т. Д., Но Роман воспринимает каждую коробочную стоимость как личное оскорбление.:)

8 голосов
/ 28 сентября 2011

Я только что взглянул на исходный код, и реализации не выглядят слишком медленными. Я бы сказал, что авторы добавили это предупреждение, потому что когда вы пишете программу в монаде Vector, вы работаете с такой высокоуровневой точки зрения, что легко забыть, что каждый >>= находится в Фактически, concatMap, который имеет тенденцию быть медленным по своей природе.

Еще одна вещь: Vector особенно быстро для распакованных типов. Таким образом, пользователь может быть привлечен к использованию нотации монады (для удобства), в то время как он должен фактически использовать распакованный тип (для скорости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...