问题
I'm trying to make a list that contains sub lists, like [1, 2, [3, 4], [3, [4, 5]]]
.
It seems like I should define a new type. I tried:
data NestedList a = Int a | List [NestedList a]
but I think its wrong, or that I don't know how to use it. I'm very new to Haskell and I'm not sure about the meaning of this expression.
Does it mean that it is making a "type" Int
with parameter a
and a "type" List
with parameter [NestedList a]
?
The data
expression above was taken from the solution to the 7th exercise of the 99 Haskell questions
(**) Flatten a nested list structure.
data NestedList a = Elem a | List [NestedList a] flatten :: NestedList a -> [a] flatten (Elem x) = [x] flatten (List x) = concatMap flatten x
but when I call flatten [[1,2], 3]
in ghci
I get the error of
couldn't match expected type 'NestedList a0' with actual type '[t0]'
回答1:
You can't call flatten [[1,2],3]
because your flatten should take a NestedList a
, not a nested normal list, which isn't even allowed in Haskell.
Your call should be something like
flatten (List [Elem 3, List [Elem 2, Elem 4], Elem 5])
回答2:
This is a side note that I couldn't fit in a comment. This does not directly answer your question but I thought you might find it useful.
Your type is the same as a Forest
. See Data.Tree
in the containers
package, which implements this type for you.
It even includes a flatten
function:
flatten :: Tree a -> [a]
... which you can make work for a Forest
too just by using concatMap
:
concatMap flatten :: Forest a -> [a]
来源:https://stackoverflow.com/questions/15884984/create-the-following-list-1-2-3-4-3-4-5-in-haskell