[英]Map function for custom n-ary tree
我正在嘗試讓像這樣的映射函數適用於n元樹,但是很費勁。
data NTree a = Leaf a | Node a [NTree a]
ntreeMap :: (a -> b) -> NTree a -> NTree b
ntreeMap f (Leaf x) = Leaf (f x)
ntreeMap f (Node y t) = Node (ntreeMap f y) (ntreeMap f t)
給我
Type error in application *** Expression : ntreeMap f t *** Term : t *** Type : [NTree b] *** Does not match : NTree a
有人可以給我指出我要去哪里的地方嗎? 謝謝
您在這里有兩個問題。 一個是您不必在Node
情況下遞歸調用y
ntreeMap
,因為它的類型為a
而不是NTree a
:
ntreeMap f (Node y t) = Node (f y) (ntreeMap f t)
第二個是t
是樹的列表,您的函數僅映射一棵樹,因此應該
ntreeMap f (Node y t) = Node (f y) (map (ntreeMap f) t)
順便說一句:您的類型是函子。
關於函子的一個有趣的事情是,只有一種方式可以使函子成為函子(並遵守函子定律)。
因此,可以自動派生Functor實例:
{-# LANGUAGE TemplateHaskell #-}
import Data.DeriveTH
data NTree a = Leaf a | Node a [NTree a]
$( derive makeFunctor ''NTree )
ntreeMap :: (a -> b) -> NTree a -> NTree b
ntreeMap = fmap
盡管我認為Rüdiger的答案是最好的,但我只是想補充一點,在GHC 6.12中,您可以自動為您的數據類型派生Functor實例:
{-# LANGUAGE -DeriveFunctor #-}
data NTree a = Leaf a | Node a [NTree a]
deriving Functor
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.