仍在使用我的文本编辑器Rasa。
目前我正在构建用于跟踪视口/拆分的系统(类似于 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
的 s 存储在树中,然后我可以遍历/fmap 来改变它们,它也与镜头包非常吻合!
我最近一直在学习递归方案,这似乎对他们来说是一个合适的用例,因为树是一个递归数据结构。
我设法弄清楚它足以构建 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
但它令人窒息,因为 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)
- 是否仍然可以定义 fmap/traverse over
a
?或者我是否需要使用递归方案原语来执行这些操作?我要实现双函子吗?实例实现会是什么样子?
其余类型都在这里,项目无法编译,因为我没有合适的 Functor 实例用于 Window...
谢谢!!