0

私はハスケルの新蜂です。ここで何が起こっているのか頭を包むことはできません

 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。なぜここで文句を言わないのですか?入力はありますか?

4

1 に答える 1

4

を返すには、 or 、 where 、およびのEither a bいずれかを使用する必要があります。最後のパターンを除くすべてで正しく使用しました:Left yRight xy :: ax :: bLeft "...."Right

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)
--                         ^^^^^
于 2014-01-18T17:20:36.587 に答える