私はハスケルの新蜂です。ここで何が起こっているのか頭を包むことはできません
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 typeNestedList a'と一致しませんでした' List'
In the expression: List (a ++ b)
In an equation forappend' の呼び出しの戻り値の型: append (List a) (List b) = List (a ++ b)。
しかし、それはor and型data NestedList a=Elem a | List [NestedList a]であるという意味ではありませんかNestedListElemList 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))whereList(x:xs)がちょうど であっても問題ありませんList。なぜここで文句を言わないのですか?入力はありますか?