【发布时间】:2014-07-03 15:48:37
【问题描述】:
所以我正在学习 Haskell,我有一个红黑树,在红黑节点中具有不同类型,如下实现:
data Rbtree a1 b1 = EmptyTree | Node a1 (Rbtree b1 a1) (Rbtree b1 a1) deriving (Show, Read, Eq)
现在我需要为它定义一个仿函数实例。因为Rbtree 是一个接受两个参数的类型构造函数,所以我必须为Rbtree c 创建一个实例。在此之后我被困住了。我的代码现在是这样的:
instance Functor (Rbtree c) where
fmap f EmptyTree = EmptyTree
fmap f (Node x left right) = Node x (fmap f left) (fmap f right)
正如你可能猜到的那样,它不会编译。 (compilation errors)。我知道fmap 因为它必须是(a -> b) -> (Rbtree c) a -> (Rbtree c) b 并且更深入地寻找Node 部分它必须是(a -> b) -> (Node c (Rbtree a c) (Rbree a c)) -> (Node c (Rbtree b c) (Rbree b c))。我不明白的是如何展开left 和right,所以我只能将f 应用于其中的一部分。我想我在这里遗漏了一些东西。
【问题讨论】:
-
另外,您对红黑树的
data定义不使用b1— 实际上您只有a1节点。 -
@CrazyFIZRUK:注意子节点是如何翻转类型参数的,这是导致问题的原因。
-
@Xeo 对,错过了那部分。
-
如何使用 GADT 来确保类型中的所有红黑树不变量? :) 我认为这不会太麻烦。
标签: haskell functor red-black-tree