如果我将玫瑰树定义为
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)
最简单的方法是启用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.