【发布时间】:2017-05-22 08:28:24
【问题描述】:
仍在使用我的文本编辑器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)
这很好用,我将Views 存储在树中,然后我可以遍历/fmap 对它们进行更改,它也与镜头包非常吻合!
我最近一直在学习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
但它会窒息,因为 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上定义 fmap/traverse?或者我是否需要使用recursion-schemes 原语来执行这些操作?我要实现双函子吗?实例实现是什么样的?
其余类型为 here,项目无法编译,因为我没有合适的 Functor 实例用于 Window...
谢谢!!
【问题讨论】:
-
是的,这是两个问题合二为一。请不要那样做。
-
不知道我在想什么哈哈,既然你回答了第一个,我会把第二个拉到新的。谢谢顺便说一句!
标签: haskell functor recursive-datastructures recursion-schemes fixpoint-combinators