2010-12-03 5 views
3

私は、次の2つの機能/問題の解決にあなたの助けが必要:マッピングより一覧

1)

私は、ツリー内の要素を交換する必要があります。ツリーのブランチは、以下に示すように、任意の数のサブブランチをコード内に持つことができます。

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show) 

mapmtree :: (a -> a) -> Tree a -> Tree a 
mapmtree f (Leaf a) = (f a) 
mapmtree f (Branch a c) = Branch (map f a) (mapmtree f c) 

要素を移動して変更する必要があります。私の問題は最後の行です。 mapmtree関数は(Tree a)を受け入れますが、ブランチはサブブランチのリストを持つことができるので、エラーが発生して上記のコードをコンパイルすることはできません。ブランチのサブリストでmapmtree関数を呼び出すにはどうすればよいですか?

これは私がそれをロードするときに私が取得エラーです:

Couldn't match expected type `Tree a' 
      against inferred type `[Tree a]' 
    In the second argument of `mapmtree', namely `c' 
    In the second argument of `Branch', namely `(mapmtree f c)' 
    In the expression: Branch (map f a) (mapmtree f c) 

2)

もう一つはこれがコードです深さ優先にリストにツリーを回すを扱います私は今ではありませんでしたが、さらに気をつけています。

それを実装する。上記と同じ問題は、支店は多くのサブツリーを持つことができ、深さ - 最初にでそれらを通過して要素のリストを作成する必要があります。

ので、私に怒ってはいけないハスケルの総初心者午前ください。

おかげ

+0

実際にFunctorを作成することに注意してください。それで 'maptree'を' fmap'に変更し、それを 'Functor'のtypeclassのインスタンスにします。実際にあなたのタイプシグネチャを変更する必要があります。 – fuz

答えて

5

1)

まず第一に、私はあなたがmap f aaがやっていることに気づくすべてが単一の値ではなく、list¹です。だからf aではなく、map f aとする必要があります。

cが木のリストであるとmapmtreeは、単一のツリーを望んでいるので、あなたはそれが動作しないことをおっしゃるとおり、あなたが実際にについて尋ねた問題に今

。あなたは何をしていますか?あなたは木のリスト内の各ツリーにmapmtreeを適用し、新しいブランチのツリーのリストとして木を結果のリストを使用します。あなたはどうやってそれをしますか?リストにmapを使用する:

mapmtree f (Branch a c) = Branch (f a) (map (mapmtree f) c) 

2)

あなたはc内の各ツリーにmtree2listを適用するためにmapを使用)1です。結果はリストのリストになります。このリストのリストをフラットなリストにするには、concat関数を使うことができます。あなたはもちろん、リストの木にmapmtreeを呼び出している場合を除き


は¹しました。

²各ツリーはmtree2listmapでリストにマップされるので、mtree2listを呼び出した結果を含むリストを返します。

+0

お返事ありがとうございます。それは、私がハケの知識を少し増やすのに役立ちます。コードは現在動作しています。 – kap

2

また、関数(a - > a)があなたに必要なタイプのツリーを与えていないので、最初の部分は間違っています。それを変更する必要があります

mapmtree f (Leaf a) = Leaf (f a) 
+0

あなたの答えに感謝します – kap