0

Tree a次のように呼ばれる多態的なデータ型を定義しました。

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

関数を受け取り、 typeのツリー内mapTの type のすべてのデータ項目に適用する関数を定義したいと考えています。この関数の本質的な目的は、関数がリストで動作するのと同じようにツリーで動作することなので、その考えに基づいて関数を作成しました。aTree amap

mapT :: (a -> b) -> Tree a -> Tree b
mapT f Leaf = Leaf
mapT f ((Tree a) left right) = (Tree a) (mapT f left) (mapT f right)

ただし、これを実行するParse error in pattern: (Tree a)と、エラーが発生し、何が問題なのかわかりません。これを通過する方法を知っている人はいますか?

4

2 に答える 2

2
  1. Treeデータコンストラクターではなく、型コンストラクターです。あなたはおそらく意味しNodeた。

  2. エラー メッセージは、パターンに任意のアプリケーションを含めることはできないことを伝えようとしています。両方とも式として有効ですが、完全に適用されたコンストラクターのみを一致させることができるため(Node a left right)、有効なパターンですが、そうでは((Node a) left right)ありません。

  3. 変換されたノードに入れるタイプのものを取得するには、に適用fする必要があります。そうしないと、型チェッカーは と一致しないと文句を言います。abab

最終結果は次のようになります。

mapT :: (a -> b) -> Tree a -> Tree b
mapT f Leaf = Leaf
mapT f (Node a left right) = Node (f a) (mapT f left) (mapT f right)
于 2012-10-18T19:28:12.530 に答える
2

試す:

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

mapT :: (a -> b) -> Tree a -> Tree b
mapT f Leaf = Leaf
mapT f (Node a left right) = Node (f a)  (mapT f left) (mapT f right)

Leafコンストラクターには is に関連付けられたデータがないことに注意してください。

data Tree a = Leaf a | Node ...

で対応する変更を行いmapTます。

また、作業が完了したら、型クラスと、なぜインスタンスを作成する必要があるのかmapT​​ について読む必要があります。FunctorFunctorTree a

instance Functor Tree where
  fmap (Leaf ...)  = ...
  fmap (Node x l r) = Node ...
于 2012-10-18T19:16:20.913 に答える