2014-02-18 2 views
5

Я имел этот вопрос на самой задней части моей памяти с тех пор я видел definition of natural transformations в старой категории-статистов пакет Эдварда Kmett в:Где функтор естественной трансформации?

-- | A natural transformation between functors f and g. 
type f :~> g = forall a. f a -> g a 

Но теперь чтение блога Стивена Diehl на adjunctions, я считаю, это:

естественное преобразование в нашем контексте будет полиморфная функция, связанная с два экземпляра Хаскел функтор Р и с типом подписи (Functor F, функтор г) => FORALL а. f a -> g a. Который мог бы быть написан синонимом следующего типа.

type Nat f g = forall a. f a -> g a 

который был оплеуху моего «Я буду продолжать игнорировать это» отношение. Итак, на вопрос: почему нормально внезапно отказаться от ограничений функтора?

+1

Когда вы используете 'Nat', вы будете поставлять типы. Сам синоним типа не использует тот факт, что они являются Функторами. Только когда вы его используете, это имеет значение, если это имеет смысл. –

+1

Хмммм. 'Forall' сам уменьшает количество функций неестественного преобразования, которые вы можете определить, даже если рассматриваемые функторы не изначально очевиден/не стучат. – AndrewC

+0

Прочтите отличные [вы могли бы определить естественные преобразования] (http://blog.sigfpe.com/2008/05/you-could-have-defined-natural.html) для лучшего объяснения взаимосвязи между полиморфизмом и естественным преобразования. – AndrewC

ответ

1

В Haskell запрещено использовать ограничение на синоним типа. И даже для типов данных он устарел в Haskell 2010. Вместо этого следует ограничить функции, которые работают с значениями этого типа.

+0

Не относится ли это только к типам данных, а не синонимам? А как насчет синонимов типа объектива? –

+0

На самом деле, теперь, когда я думаю об этом, типы объективов немного отличаются, потому что переменные типа Functor универсально оцениваются. Я все еще подозреваю, что устаревание, о котором вы говорите, применимо только к типам данных (возможно, «новый тип»). –

+4

Это работает отлично для меня, если я включаю 'RankNTypes' и' TypeOperators': 'type f: -> g = forall x. (Functor f) => f x -> g x' –

Смежные вопросы