如果我将玫瑰树定义为
data RTree = Node a [RTree a]
deriving(Show, Eq)
我如何为它定义地图功能? map函数定义为
map_rose_tree :: (a -> b) -> RTree a -> RTree b
答案 0 :(得分:8)
最简单的方法是启用DeriveFunctor
扩展程序和derive Functor
:
{-# LANGUAGE DeriveFunctor #-}
data RTree a
= Node a [RTree a]
deriving (Show, Eq, Functor)
map_rose_tree = fmap
但是如果您想自己定义实例,则需要在RTree
构造函数上进行模式匹配:
instance Functor RTree where
fmap f (Node a children) = Node _ _
您必须自己填写两个_
。如果你有一个足够新的GHC版本,你可以编译它并得到错误,告诉你洞的类型(_
)以及你可以用来实现它的相关绑定。第一个洞非常简单,第二个洞更具挑战性,但我向您保证只有fmap
,f
,a
和children
才能解决