如果我将玫瑰树定义为
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)。第一个洞很容易,第二个有点挑战性,但我向你保证它可以只用 fmap
、 f
、 a
和 children
解决。关于Haskell - 在玫瑰树上映射函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29972130/