我是一個haskell新的蜜蜂。我不能換我圍繞這到底是怎麼回事瞭解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)`
它給了我的頭錯誤
無法比擬預期型Either String (NestedList a)' with actual type
NestedList一個」 在List' In the expression: List (a ++ b) In an equation for
追加的調用的返回類型': append(List a)(List b)= List(a ++ b)。
但data NestedList a=Elem a | List [NestedList a]
並不意味着該NestedList
類型爲Elem
或List
of NestedList
和
append::NestedList a->NestedList a->Either String (NestedList a)
是追加可以返回String
或NestedList
。現在,當我做List(a++b)
我正在返回List
。它應該工作不是嗎?
我的其他功能扁平化
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 [])=[]
正常工作,而它的輸入參數也是NestedList
但GHC是細跟flatten
(List(x:xs))
其中List(x:xs)
也只是List
。爲什麼不在這裏抱怨?任何投入?
BTW,沒有必要爲'append'在這些混合的情況下失敗。你仍然可以返回一個'NestedList'。 – augustss