【发布时间】:2012-03-19 10:12:14
【问题描述】:
我必须编写一个扁平化列表的函数。
例如flatten [] = [] 或flatten [1,2,3,4] = [1,2,3,4] 或flatten [[1,2],[3],4,5]] = [1,2,3,4,5]
我无法根据给定的 flatten 函数匹配类型。
这是我所拥有的:
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; flatten (B xs) = C xs; flatten (C xss) = C (concat xss)会帮助你?基本上,您不能编写 flatten 以便它获取不同嵌套的列表并对它们执行不同的操作,除非您将它们包装成新类型并通过构造函数区分情况。 -
你的函数类型应该是
[[a]] -> [a]。这意味着flatten []有效,flatten [[1,2,3,4]]有效,但flatten [1,2,3,4]无效。[1,2,3,4]不是列表列表。如果您考虑到这一点并从头开始,摆脱您的特殊类型,您会发现它会容易得多。
标签: list haskell types abstract