在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]]
列表。