Vous pouvez déclarer une instance de la classe Functor
. C'est une classe standard pour les types de données qui permettent de mapper une fonction.S'il vous plaît noter la similitude du type de fmap
est à votre type de » mapT
:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Supposons que votre arbre est défini comme
data Tree a = Node (Tree a) (Tree a) | Leaf a
deriving (Show)
Ensuite, vous pouvez déclarer une instance de Functor
cette façon:
instance Functor Tree where
fmap f (Node l r) = Node (fmap f l) (fmap f r)
fmap f (Leaf x) = Leaf (f x)
Voici comment vous pouvez l'utiliser:
main = do
let t = Node (Node (Leaf 1) (Leaf 2)) (Leaf 3)
let f = show . (2^)
putStrLn $ "Old Tree: " ++ (show t)
putStrLn $ "New Tree: " ++ (show . fmap f $ t)
Sortie:
Old Tree: Node (Node (Leaf 1) (Leaf 2)) (Leaf 3)
New Tree: Node (Node (Leaf "2") (Leaf "4")) (Leaf "8")
Vous pouvez également définir pour des raisons pratiques:
mapT = fmap
Sûrement, vous pouvez le faire sans classes de type, mais il rend le code plus lisible pour les autres si vous utiliser des fonctions standard (tout le monde connaît le comportement habituel de fmap
).
Est-ce ce devoir? Si oui, veuillez marquer en conséquence. – Thomas
'mapT = fmap'? – kennytm