Может кто-нибудь объяснить, почему они оба скомпилируются с радостью:
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?