Пример использования рюкзака - PullRequest
0 голосов
/ 27 сентября 2018

Я смотрю ссылки на backpack вики , пытаясь понять, в каких случаях использование backpack будет считаться целесообразным по сравнению с другими функциями Haskell, такими как классы типов и семейства типов.

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

Есть ли примеры, которые кратко показывают преимущества рюкзака по сравнению с более традиционными функциями Haskell?Если приведенный выше пример является хорошим, знаете ли вы, почему решение, использующее семейства типов, было бы неполноценным?

1 Ответ

0 голосов
/ 28 июня 2019

Основные преимущества Backpack:

  1. Гарантированное отсутствие снижения производительности (использование классов типов может привести к снижению производительности из-за того, как они реализованы в Haskell).Это чрезвычайно важно при работе со строковыми типами данных, анализаторами, контейнерами и т. Д.
  2. Более чистый и приятный код по сравнению с использованием классов типов или семейств типов.

Я написал сообщение в блогеоб одном конкретном использовании Backpack: реализация полиморфного интерфейса для структур данных контейнеров:

Имея такойИнтерфейс для контейнеров позволяет:

  1. Писать полиморфные функции, которые работают с любым контейнером (например, Map, HashMap и IntMap).
  2. Написать один набор тестов длясвойства контейнеров и использовать его в каждом пакете без дублирования кода.
  3. Написать единый тест и использовать с каждой структурой данных контейнеров без снижения производительности.

Если условия сделать код чище.Это подпись функции groupBy, реализованной с помощью Backpack:

groupBy :: forall k f a . (Foldable f, Key k) => (a -> k) -> f a -> Map k (NonEmpty a)

Понятно, и это просто обычный Haskell.Если вы реализуете интерфейс для контейнеров, использующих классы типов и семейства типов (это сделано в relude, эта подпись будет выглядеть так:

groupBy
    :: forall f t a . (Foldable f, DynamicMap t, Val t ~ NonEmpty a, Monoid t)
    => (a -> Key t) -> f a -> t

Гораздо сложнее читать и понимать.

Также недавно обсуждалось , что Backpack может помочь избежать CPP, когда вам нужно скомпилировать код на Haskell для разных платформ (он же условная компиляция).

...