Haskell 哈斯凯尔树上的地图

Haskell 哈斯凯尔树上的地图,haskell,Haskell,我如何定义一个像map一样工作但在树上工作的函数?新功能的打字签名为: data Tree a = Empty | Node a (Tree a) (Tree a) map :: (a -> b) -> [a] -> [b] 甚至可以为map创建一个通用的typeclass吗?该typeclass已经存在于Prelude: 要实现它,您可以使用语言扩展,这样GHC就可以通过派生子句为您实现它: class Functor f where fmap :: (a -&g

我如何定义一个像map一样工作但在树上工作的函数?新功能的打字签名为:

data Tree a = Empty | Node a (Tree a) (Tree a)

map :: (a -> b) -> [a] -> [b]

甚至可以为map创建一个通用的typeclass吗?

该typeclass已经存在于Prelude:

要实现它,您可以使用语言扩展,这样GHC就可以通过
派生
子句为您实现它:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
或者,您也可以手动实现它:

{-# LANGUAGE DeriveFunctor #-}

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Functor)

mapTree :: (a -> b) -> Tree a -> Tree b
mapTree = fmap
{-# LANGUAGE DeriveFunctor #-}

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Functor)

mapTree :: (a -> b) -> Tree a -> Tree b
mapTree = fmap
data Tree a = Empty | Node a (Tree a) (Tree a)

mapTree :: (a -> b) -> Tree a -> Tree b
mapTree _ Empty = Empty
mapTree f (Node x l r) = Node (f x) (mapTree f l) (mapTree f r)

instance Functor Tree where
    fmap = mapTree