在Haskell中创建以下列表[1,2,[3,4],[3,[4,5]]]

use*_*424 3 haskell nested-lists

我正在尝试创建一个包含子列表的列表,比如[1, 2, [3, 4], [3, [4, 5]]].

好像我应该定义一个新类型.我试过了:

data NestedList a = Int a | List [NestedList a]
Run Code Online (Sandbox Code Playgroud)

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

这是否意味着这是有"型" Int与参数a和一个"型" List与参数[NestedList a]

data上面的表达式取自99 Haskell问题的第7次练习的解决方案

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

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

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List x) = concatMap flatten x
Run Code Online (Sandbox Code Playgroud)

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

couldn't match expected type 'NestedList a0' with actual type '[t0]'
Run Code Online (Sandbox Code Playgroud)

md2*_*rpe 10

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

你的电话应该是这样的

flatten (List [Elem 3, List [Elem 2, Elem 4], Elem 5])
Run Code Online (Sandbox Code Playgroud)

  • 他说的是[[1,2,3]与Haskell中的NestedList类型不同,即使外观与data MyInt = Int相同也与Int不同。他的另一点[[1,2]`是Num的列表,而`3`是Num,所以甚至不允许使用[[1,2,3]],因为`[1,2]`与“ 3”类型不同。 (2认同)

Gab*_*lez 8

这是一个侧面说明,我不能适应评论.这不直接回答你的问题,但我认为你可能会觉得它很有用.

你的类型与a相同Forest.见Data.Treecontainers包,它实现了这种类型的为您服务.

它甚至包括一个flatten功能:

flatten :: Tree a -> [a]
Run Code Online (Sandbox Code Playgroud)

...你可以Forest通过使用concatMap以下方式为...工作:

concatMap flatten :: Forest a -> [a]
Run Code Online (Sandbox Code Playgroud)