Haskell - 在Rose Tree上映射函数

vs9*_*734 3 tree haskell

如果我将玫瑰树定义为

data RTree = Node a [RTree a]
    deriving(Show, Eq)
Run Code Online (Sandbox Code Playgroud)

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

map_rose_tree :: (a -> b) -> RTree a -> RTree b
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 8

最简单的方法是启用DeriveFunctor扩展和derive Functor:

{-# LANGUAGE DeriveFunctor #-}

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

map_rose_tree = fmap
Run Code Online (Sandbox Code Playgroud)

但是如果你想自己定义实例,你需要在RTree构造函数上进行模式匹配:

instance Functor RTree where
    fmap f (Node a children) = Node _ _
Run Code Online (Sandbox Code Playgroud)

你必须_自己填写这两个.如果你有一个足够新的GHC版本,你可以编译它并得到错误,告诉你hole(_)的类型以及你可以用来实现它的相关绑定.第一洞是很容易的,第二个是多一点挑战性,但我向你保证,它可以只得到解决fmap,f,a,和children.