我必须编写一个展开列表清单的函数。展开列表清单
例如flatten [] = []
或flatten [1,2,3,4] = [1,2,3,4]
或flatten [[1,2],[3],4,5]] = [1,2,3,4,5]
我遇到的麻烦的是能够匹配取决于什么是考虑到扁平化的功能类型。
这是我有:
data A a = B a | C [a] deriving (Show, Eq, Ord)
flatten::(Show a, Eq a, Ord a)=>A a -> A a
flatten (C []) = (C [])
flatten (C (x:xs)) = (C flatten x) ++ (C flatten xs)
flatten (B a) = (C [a])
从我可以告诉的问题是,++
运营商期待于它的两个参数列表,我想给它A
类型的东西。我添加了A
类型,因此该函数可以获取单个元素或元素列表。
有谁知道以不同的方式来做这个不同的,或解释我能做些什么来解决类型错误?
我不知道你想要什么。也许'flatten :: A [a] - > A a;展平(B xs)= C xs; flatten(C xss)= C(concat xss)'会帮助你吗?基本上,你不能写扁平化,以便它需要不同的嵌套列表并且与它们做不同的事情,除非你将它们包装成新类型并通过构造函数区分这些情况。 – 2012-02-29 22:07:13
函数的类型应该是'[[a]] - > [a]'。这意味着'flatten []'是有效的,并且'flatten [[1,2,3,4]]'是有效的,但是'flatten [1,2,3,4]'不是。 '[1,2,3,4]'不是列表的列表。如果你仔细想想并从头开始,摆脱你的特殊类型,你会发现它更容易。 – 2012-02-29 22:10:42
[列表中的操作| |列表中的操作可能重复如何](http://stackoverflow.com/questions/9477806/operation-on-list-of-lists-how) – rampion 2012-03-01 02:23:32