如果我将玫瑰树定义为

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

我将如何为它定义 map 函数? map函数定义为
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 版本,你可以编译它并得到错误,告诉你漏洞的类型 (_) 以及你可以用来实现它的相关绑定(bind)。第一个洞很容易,第二个有点挑战性,但我向你保证它可以只用 fmapfachildren 解决。

关于Haskell - 在玫瑰树上映射函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29972130/

10-11 19:57