2009-11-08 3 views
1

N 진 트리에 대해 this과 같은 매핑 기능을 사용하려고하는데 어려움을 겪고 있습니다.사용자 지정 트리에 대한 맵 기능

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 

사람이 어디 잘못된거야에 관해서는 나에게 포인터를 줄 수 나에게 준다? 감사합니다

답변

9

여기에는 두 가지 문제점이 있습니다. 하나는 유형 a이며 당신이 Node 경우 y 재귀 적 ntreeMap를 호출 할 필요가 있다는 것입니다하지 NTree a :

ntreeMap f (Node y t) = Node (f y) (ntreeMap f t) 

두 번째는 t 나무의 목록입니다 당신의 기능은 이상 매핑이다 단일 트리, 그것은 있도록 BTW

ntreeMap f (Node y t) = Node (f y) (map (ntreeMap f) t) 
3

해야한다 : 당신의 유형은 펑터이다.

Functors의 흥미로운 점은 유형이 Functor (및 Functor 법률 준수)에 한 가지 방법이 있다는 것입니다.

따라서 인스턴스가 자동으로 유도 할 수있다은 Functor : 나는 뤼디거의 대답은 그냥 GHC 6.12에 그를 추가하고 싶었 최선의 하나라고 생각하지만

{-# 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 
+3

완벽을 기하기 위해서 :이 패키지가 작동하려면'derive' 패키지 (http://hackage.haskell.org/package/derive)가 필요합니다. 또한 GHC 6.12에서'-XDerivingFunctor' 확장을 사용하여 코드에서'파생 함수 파생 ​​'을 간단하게 사용할 수 있습니다. –

0

당신이 당신의 데이터 유형에 대한 펑터 인스턴스를 도출 자동으로 할 수 있습니다

{-# LANGUAGE -DeriveFunctor #-} 
data NTree a = Leaf a | Node a [NTree a] 
    deriving Functor 
관련 문제