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 版本,你可以编译它并得到错误,告诉你漏洞的类型 (_
) 以及你可以用来实现它的相关绑定。第一个洞很简单,第二个洞有点难,但我向你保证,只用 fmap
、f
、a
和 children
就可以解决.
如果我将玫瑰树定义为
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 版本,你可以编译它并得到错误,告诉你漏洞的类型 (_
) 以及你可以用来实现它的相关绑定。第一个洞很简单,第二个洞有点难,但我向你保证,只用 fmap
、f
、a
和 children
就可以解决.