Haskell - 在玫瑰树上映射函数

Haskell - Mapping a function over a Rose Tree

如果我将玫瑰树定义为

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

我将如何为它定义一个地图函数?地图函数定义为

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

最简单的方法是启用 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 就可以解决.