2012-10-18 141 views
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),我無法弄清楚什麼是錯的。有沒有人有任何想法如何通過這個?

回答

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構造不具有與之相關聯的任何數據,因此,或許你真的想:

data Tree a = Leaf a | Node ... 

mapT相應的改變。

而且,一旦你得到了mapT爲你工作,你應該在Functor型課堂上閱讀了,爲什麼你可能要創建Tree a一個Functor實例:

instance Functor Tree where 
    fmap (Leaf ...) = ... 
    fmap (Node x l r) = Node ... 
+0

感謝的快速反應。有效 :) – NuNu

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)