2015-02-12 2 views
6

Почему существуют типы и WrappedArrow? Это потому, что Monad s не были Applicative? Учитывая, что WrappedArrow существует, если экземплярПочему WrappedMonad и WrappedArrow?

Arrow a => Applicative (Arrow a b) 

просто встроены в сам Haskell таким же образом, что Applicative теперь суперкласс Monad?

ответ

8

Практически так для WrappedMonad. Я предполагаю, что он становится (и, возможно, уже был) существенно устаревшим. Но WrappedArrow сложнее, потому что типы Arrow и Applicative имеют разные виды, * -> * -> * - * -> *. И из-за способа разрешения экземпляра GHC работает, добавляя экземпляр (я предполагаю, что дополнительный Arrow опечатка)

instance Arrow a => Applicative (a b) 

будет означать, что не конструктор типа с двумя или более аргументами тогда не мог дать Applicative без также давая Arrow - это кажется довольно резким.

Обратный вариант добавления суперкласс Applicative (a b) => к Arrow a будет казаться более приемлемым - разве вы не можете иметь суперкласса с forall'ed типа как b. Такие суперклассы были бы полезны и для других вещей, и их много раз предлагали, поэтому я предполагаю, что их трудно реализовать.

+0

Это также случай, когда большинство людей считают класс 'Arrow' неправильным, поэтому сделать его суперклассом чрезвычайно важного класса« Applicative », вероятно, не будет так хорошо. – dfeuer

+1

Подкласс @dfeuer, а не суперкласс. Это не повлияет непосредственно на «Аппликативный». Тем не менее, невозможно с текущей системой классов. –

+0

Ах, я пропустил вашу мысль, я думаю. – dfeuer