3

我正在尝试制作一个包含子列表的列表,例如[1, 2, [3, 4], [3, [4, 5]]].

看来我应该定义一个新类型。我试过:

data NestedList a = Int a | List [NestedList a]

但我认为它错了,或者我不知道如何使用它。我对 Haskell 很陌生,我不确定这个表达式的含义。

这是否意味着它正在创建一个Int带有参数的“类型”和一个带有参数的a“类型” ?List[NestedList a]

上面的data表达式取自Haskell 99 题第 7题的解法

(**) 展平嵌套列表结构。

data NestedList a = Elem a | List [NestedList a]

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List x) = concatMap flatten x

但是当我打电话时flatten [[1,2], 3]ghci我得到了错误

couldn't match expected type 'NestedList a0' with actual type '[t0]'
4

2 回答 2

10

你不能打电话flatten [[1,2],3],因为你的 flatten 应该采用一个NestedList a,而不是一个嵌套的普通列表,这在 Haskell 中甚至是不允许的。

你的电话应该是这样的

flatten (List [Elem 3, List [Elem 2, Elem 4], Elem 5])
于 2013-04-08T17:28:40.563 回答
8

这是一个旁注,我无法发表评论。这并不能直接回答您的问题,但我认为您可能会发现它很有用。

您的类型与 a 相同Forest。请参阅包Data.Tree中的内容,它为您实现了这种类型containers

它甚至包括一个flatten功能:

flatten :: Tree a -> [a]

...您也可以通过以下方式为 aForest工作concatMap

concatMap flatten :: Forest a -> [a]
于 2013-04-08T19:22:49.400 回答