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