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

在Haskell中创建以下列表[1,2,3,4],[3,4,5]],haskell,nested-lists,Haskell,Nested Lists,我试图创建一个包含子列表的列表,如[1,2,3,4],[3,4,5]] 似乎我应该定义一种新类型。我试过: data NestedList a = Int a | List [NestedList a] 但我认为这是错误的,或者我不知道如何使用它。我对Haskell很陌生,我不确定这个表达的意思 这是否意味着它正在制作一个带有参数a的“type”Int和一个带有参数[NestedList a]的“type”列表 上面的数据表达式取自 (**)展平嵌套列表结构 data NestedList a

我试图创建一个包含子列表的列表,如
[1,2,3,4],[3,4,5]]

似乎我应该定义一种新类型。我试过:

data NestedList a = Int a | List [NestedList a]
但我认为这是错误的,或者我不知道如何使用它。我对Haskell很陌生,我不确定这个表达的意思

这是否意味着它正在制作一个带有参数
a
的“type”
Int
和一个带有参数
[NestedList a]
的“type”
列表

上面的
数据
表达式取自

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

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

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List x) = concatMap flatten x
但是当我在
ghci中调用
flatten[[1,2],3]
时,我得到的错误是

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

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

你的电话应该是

flatten (List [Elem 3, List [Elem 2, Elem 4], Elem 5])

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

您的类型与林的类型相同。请参见
containers
包中的
Data.Tree
,它为您提供了一个

它甚至包括一个
展平
功能:

flatten :: Tree a -> [a]
。。。只需使用
concatMap
,您也可以为
森林
工作:

concatMap flatten :: Forest a -> [a]

他是说,
[[1,2],3]
与haskell中的
嵌套列表
的类型不同,尽管它们看起来与
数据MyInt=Int
不同。他的另一点是
[1,2]
是一个
Num
的列表,
3
是一个Num,所以
[1,2],3]
是不允许的,因为
[1,2]
3
的类型不同。当我写:t[1,2[3]]时,我得到[1,2[3]:(Num t,Num[t])=>但是我不知道如何创建一个新的类型来允许我拥有这样一个列表。拥有像
[1,2,3]
这样的东西只是编写
1:2:3:[]
的一些特殊语法糖分,我认为你不能将
[1,2,3]
符号用于你自己的数据类型。现在,对于您定义的数据类型,有两个构造函数,
List
Elem
。md2perpe已经展示了一个如何使用它们的示例。如果您想要一段表示类似
[[1,2],3]
的数据(您无法使用普通列表创建),您可以编写
List[List[Elem 1,Elem 2],Elem 3]
@user2254424,只需将
[t]
作为
Num
的一个实例。这里可以看到一种方法:发生的情况是,
[1,2,[3]
中的
1
2
通过
fromInteger
转换为
[1]
,即
[2]
,这样您就得到了
[[1]、[2]、[3]]
列表。