簡體   English   中英

自定義n元樹的映射功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM