Работа над текстовым редактором Rasa.Рекурсивные схемы, использующие `Fix` для типа данных, который уже является Functor?
На данный момент я создаю систему для отслеживания видовых экранов/разделов (аналогично разрыву vim). Это казалось естественным для меня, чтобы представить эту структуру в виде дерева:
data Dir = Hor
| Vert
deriving (Show)
data Window a =
Split Dir SplitInfo (Window a) (Window a)
| Single ViewInfo a
deriving (Show, Functor, Traversable, Foldable)
Это прекрасно работает, я хранить мои View
с в дереве, а затем я могу траверсировать/БПМЖ над ними, чтобы изменить их, это также согласуется с объектив пакет довольно хорошо!
В последнее время я узнал о Recursion Schemes, и кажется, что это подходящий прецедент для них, поскольку дерево является рекурсивной структурой данных.
мне удалось понять это достаточно хорошо, чтобы построить из версии Fixpoint:
data WindowF a r =
Split Dir SplitInfo r r
| Single ViewInfo a
deriving (Show, Functor)
type Window a = Fix (WindowF a)
Однако теперь экземпляр Functor используется вверх по r
;
Я попробовал несколько вариантов
deriving instance Functor Window
Но дроссели, потому что окно является синонимом типа.
И:
newtype Window a = Window (Fix (WindowF a)) deriving Functor
И это не удается тоже;
• Couldn't match kind ‘* -> *’ with ‘*’
arising from the first field of ‘Window’ (type ‘Fix (WindowF a)’)
• When deriving the instance for (Functor Window)
- ли еще можно определить БПМЖ/траверс над
a
? Или мне нужно делать эти операции с помощью примитивов recursion-schemes? Я использую Bifunctor? Как выглядит реализация экземпляра?
Остальные типов here, проект не компилируется, потому что не имеет надлежащий экземпляр Functor для Window ...
Спасибо !!
Да, это * это * два вопроса в одном. Пожалуйста, не делай этого. – dfeuer
Не уверен, что я думал о ха-ха, так как вы ответили первым, я вытащу второй в новый. Спасибо, BTW! –