2014-01-18 6 views
0

저는 새로운 hase입니다. 난 그냥 내가 오류 여기가 제공haskell의 데이터 유형을 알고 싶습니다.

data NestedList a=Elem a | List [NestedList a] deriving Show 

append::NestedList a->NestedList a->Either String (NestedList a) 
append (Elem x) (Elem y) = Right $ List [Elem x, Elem y] 
append (_) (Elem _)=Left "Elements are not allowed" 
append (Elem _) (_)=Left "Elements are not allowed" 
append (List a) (List b)=List(a++b)` 

을 무슨 일이 일어나고 있는지 주위에 내 머리를 정리 할 수 ​​

List' In the expression: List (a ++ b) In an equation for APPEND의 호출의 반환 유형에 유형 Either String (NestedList a)' with actual type NestedList는 ' 예상과 일치 할 수 없습니다 ': append (List a) (List b) = 목록 (a ++ b).

그러나 data NestedList a=Elem a | List [NestedList a] 그것은 NestedList 유형의 것을 의미하지 않는다 Elem 또는 Listof NestedList 및 반환 할 수 있습니다 추가

append::NestedList a->NestedList a->Either String (NestedList a) 

중 하나 String 또는 NestedList. 지금 내가 List(a++b) 할 때 나는 List를 돌려주고있다. 그렇지?

내 다른 함수는 입력 매개 변수도 NestedList하지만 List(x:xs) 또한 단지 List입니다 GHC는 flatten(List(x:xs))으로 괜찮 동안

flatten ::NestedList a->[a] 
flatten (Elem x)=[x] 
flatten (List(x:xs))=flatten(x)++flatten(List xs) 
--flatten NestedList (x:xs)=flatten(x)++flatten(List xs) 
flatten(List [])=[] 

잘 작동 평평. 왜 불평하지 않니? 어떤 입력? Either a b를 반환하기 위해

+3

: 당신은 제대로 Left "...."Right 모두 그러나 마지막 패턴을 사용했다. 여전히 NestedList를 반환 할 수 있습니다. – augustss

답변

5

, 당신은 사용해야 하나 Left y 또는 Right x, 어디 y :: ax :: b. 그 혼합의 경우 실패`append`에 대한 필요가 없습니다, BTW

data NestedList a=Elem a | List [NestedList a] deriving Show 

append::NestedList a->NestedList a->Either String (NestedList a) 
append (Elem x) (Elem y) = Right $ List [Elem x, Elem y] 
append (_) (Elem _)  = Left $ "Elements are not allowed" 
append (Elem _) (_)  = Left $ "Elements are not allowed" 
append (List a) (List b) = Right $ List(a++b) 
--       ^^^^^ 
관련 문제