"Обобщенные стрелки" и обозначения процедур? - PullRequest
12 голосов
/ 16 июня 2019

Когда я узнал о Control.Arrow и встроенной нотации Haskell proc, у меня возникла мысль, что этот язык может оказаться очень полезным в качестве eDSL для общих моноидальных категорий (используя *** для тензора и >>> для композиции), если бы только класс типов Arrow был обобщен, чтобы разрешить общую операцию tens :: * -> * -> *, а не Arrow * (,) : * -> * -> *.

После некоторых исследований я обнаружил GArrows, которые, кажется, соответствуют моим потребностям.Однако связанный класс типов Garrow поставляется в комплекте с так называемыми расширениями GHC "HetMet" и поддержкой других функций, которые (пока, во всяком случае), мне не особо нужны, такие как "модальные типы"".

Учитывая, что я хотел бы иметь возможность использовать такой класс типов GArrow без необходимости установки нестандартных расширений GHC:

  1. Существует ли фактическая(несколько стандартизированная) библиотека в Hackage, которая отвечает моим потребностям в таком обобщенном классе типов стрелок?

  2. Учитывая такую ​​библиотеку, есть ли способ использовать такой класс типа GArrow с"обобщенное proc" обозначение без необходимости создавать собственное расширение GHC?(Возможно, с RebindableSyntax)

Примечание: Кроме того, я в порядке с использованием квазиквотации для обобщенной записи proc.Поэтому, возможно, было бы не сложно изменить что-то вроде this в соответствии с моими потребностями.

1 Ответ

6 голосов
/ 16 июня 2019

Я тоже думал об этом раньше. Но - proc обозначение настолько широко считается глупым чудаком, что, вероятно, также нет особого интереса к обобщению (хотя, я полагаю, это то, что сделало бы его действительно полезным!)

Однако на самом деле необязательно иметь специальный синтаксис. Первичная ссылка, которая должна быть названа здесь, - это работа Конала Эллиотта по компиляции лямбда-нотации к бикартезианским закрытым категориям . Который, я думал, уже давно завоевал популярность в сообществе Haskell, но почему-то этого не произошло. Он доступен как плагин GHC, во всяком случае.

Даже это не всегда нужно. Для некоторых комбинаторов категорий вы можете просто обернуть значение, которое повсеместно определено в аргументе, и рассматривать его как псевдо-возвращаемое значение. Я называю их Agent в категориях с ограничениями ; не уверен, пригодно ли это для вашего приложения, во всяком случае, можно сделать несколько вещей с категориями в виде стрелок . (В ограниченных категориях тензорный продукт установлен на (,), однако, вероятно, это не то, что вам нужно. Хотя, не могли бы вы объяснить, какой тензорный продукт вам нужен?)

...