我正在尝试在Haskell中为我的Tree数据类型定义Functor的实例

时间:2011-02-22 01:35:43

标签: haskell

我今天下午正在学习仿函数,并且正在尝试为我刚写完的树数据类型编写一个。

data GTree a = Node a [GTree a] deriving (Show, Read, Eq)  

instance Functor GTree where
        fmap f n [] = f n
        fmap f n a = f n fmap a

我正在尝试编写它,以便如果列表为空,则映射到单个节点。否则,以递归方式映射列表。这是我得到的错误。

The equation(s) for `fmap' have three arguments,
but its type `(a -> b) -> GTree a -> GTree b' has only two
In the instance declaration for `Functor GTree'

据我所知,我对fmap有太多的论据,但我无法弄清楚如何写出来,以便反映出我想要它做的事情。

如果有人能帮我解决这个问题,我将不胜感激。谢谢!

编辑: 这是我发现的一种可能的解决方案,但我并不是真的理解它。

instance Functor GTree where
    fmap f (Node a ts) = Node (f a) (map (fmap f) ts)

1 个答案:

答案 0 :(得分:3)

fmap所做的是它需要一个类型为a -> b的函数加上一个a的框,它将返回b的框。您应该使用n []n a来代替(Node a [])(Node a xs),而instance Functor GTree where fmap f (Node a xs) = Node (f a) (fmap (fmap f) xs) 和{{1}}将与没有任何子节点的Node匹配,Node与子节点匹配。

{{1}}