Может кто-нибудь объяснить, почему они оба скомпилируются с радостью:
data A a b = A { a :: a, b :: b }
newtype B a = B (A a (B a))
newtype C = C (A Int C)
Но я не могу создать аналогично рекурсивно определенные типы через синонимы типов?
type B a = A a (B a)
type C = A Int C
Хотя очевидно, что data B a = A { a :: a, b :: B a } работает просто отлично.
Есть ли способ избежать использования этого дополнительного конструктора X везде, где я хочу, чтобы тип был рекурсивным? Я в основном передаю функции доступа, которые всегда выбирают b, поэтому я в основном в порядке, но если есть простой механизм обхода, я бы хотел знать об этом.
Любые прагмы, которые я должен использовать для повышения производительности с помощью специализированного типа данных C? Просто специализируйтесь на материалах?
Какой-нибудь умный трюк для копирования между A a b и A c d, определяющий только сопоставление a -> b и c -> d без копирования за запись дважды? Боюсь, что поля A меняются в будущем. Возможно, шаблон Haskell?