Почему я не могу определить экземпляр Haskell Arrow в терминах arr и *** / &&& - PullRequest
12 голосов
/ 02 июня 2011

Я все еще справляюсь с определением и использованием Стрелок в Haskell. При определении новых стрелок мне гораздо проще думать с точки зрения *** или &&&, а не с первой и второй, поскольку большую часть времени я хочу проводить специальную обработку для комбинации двух стрелок.

Однако класс Arrow не позволяет определять стрелку в терминах arr и *** или &&& и требует определения first для включения. Это означает, что я вынужден написать код, подобный следующему -

instance Arrow X where
  arr f = ...
  f (***) g = ...
  first f = f *** arr id

Мне кажется, что не было бы никакого вреда, если бы мы включили определение по умолчанию 'first' в модуль Control.Arrow. Это позволило бы нам выбирать между определением первого или ***.

Есть ли веская причина, по которой определение по умолчанию first не было включено в класс Arrow? Единственная причина, по которой я могу придумать, состоит в том, что пользователь может опустить определение first и *** обоих, и тогда у вас будут круговые определения, но разве это единственная причина?

Ответы [ 2 ]

5 голосов
/ 07 июня 2011

Data.Monoid имеет похожую отсутствующую альтернативу минимального-полного определения: mconcat. Как и в случае с Arrow, эта альтернатива отсутствует из соображений производительности. mappend a b = mconcat[a,b] неэффективно из-за сопоставления с образцом в mconcat.

С Arrows неэффективность не так очевидна, но более жестока: подумайте о том, чтобы не оптимизировать arr id прочь:

Используя CleisliArrow в качестве примера Arrow, это выглядит так:

first f (x,y) = do
    x' <- f x
    return (x',y)

И это будет:

first f (x,y) = do
    x' <- f x
    y' <- arr id y
    return (x',y')

Функция arr не может соответствовать шаблону функции id и поэтому должна вводить дополнительные издержки для переноса этой функции.

4 голосов
/ 02 июня 2011

Я на самом деле считаю, что именно цикличность не позволила кому-то написать методы по умолчанию.Но, как отметил @camccann, это должно остановить любого.Предложить изменения!

...