0

我定义了一个多态数据类型Tree a,如下所示:

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

我想定义一个函数mapT,它接受一个函数并将其应用于类型a树中的每个类型数据项Tree a。这个函数的基本目的是对树进行操作,就像map函数在列表上操作一样,所以我根据这个想法编写了一个函数:

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

尝试:

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为你工作,你应该阅读Functor类型类,以及为什么你可能想要创建一个Functor实例Tree a

instance Functor Tree where
  fmap (Leaf ...)  = ...
  fmap (Node x l r) = Node ...
于 2012-10-18T19:16:20.913 回答
2
  1. Tree是类型构造函数,而不是数据构造函数。你可能的意思是Node

  2. 错误消息试图告诉您,您不能在模式中使用任意应用程序。您只能匹配完全应用的构造函数,因此(Node a left right)是有效的模式,而((Node a) left right)不是,即使两者都作为表达式有效。

  3. 您需要申请f才能a将某种类型b的东西放入转换后的节点中。否则类型检查器会抱怨它不能ab.

最终结果应如下所示:

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 回答