2016-12-04 3 views
0

GTreeの葉で要素上所定の機能をマップ私のGTreeデータ構造のためにこの関数を書く必要がありますが、私はそれを作ることができません..今の私はこの種の関数を持っています:はHaskellは、私は、データ構造を持っ

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree f (Gnode [a]) = Gnode [mapTree f a] 
mapTree f (Leaf a) = Leaf f 

誰かがそれを完了するのを助けてくれますか?または、少なくとも実装方法について説明してください。

答えて

4

あなたはほぼそこにいます!サブツリーのリストに複数の要素がある場合を処理するのを忘れてしまった。パターン[x]は、単一要素のリストを表します。

サブツリーtsの任意の長い(または短い)リストに一致させてから、mapを使用して、それぞれに再帰呼び出しを適用します。

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree f (Gnode ts) = Gnode (map (mapTree f) ts) 
mapTree f (Leaf x) = Leaf (f x) 

NB。私はこれがエクササイズだと知っていますが、プロダクションコードでは、GHCにDeriveFunctor言語拡張機能を使ってこの機能を書くよう依頼しています。

{-# LANGUAGE DeriveFunctor #-} 

data GTree a = Leaf a | Gnode [GTree a] deriving Functor 

mapTree :: (a -> b) -> GTree a -> GTree b 
mapTree = fmap 
関連する問題