我今天下午正在学习仿函数,并且正在尝试为我刚写完的树数据类型编写一个。
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)
答案 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}}