Haskell - 在Rose Tree上映射函数

时间:2015-04-30 15:43:05

标签: haskell tree

如果我将玫瑰树定义为

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

我如何为它定义地图功能? map函数定义为

map_rose_tree :: (a -> b) -> RTree a -> RTree b

1 个答案:

答案 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版本,你可以编译它并得到错误,告诉你洞的类型(_)以及你可以用来实现它的相关绑定。第一个洞非常简单,第二个洞更具挑战性,但我向您保证只有fmapfachildren才能解决