【发布时间】:2017-04-22 04:58:48
【问题描述】:
我在 Haskell 中定义了一个递归数据结构:
data NestedList a = Element a | SubList [NestedList a]
然后我想定义一个flatten 函数,它将获取一个 NestedList 列表并返回扁平化结果,例如:
Input: [Element 1, SubList [Element 2, SubList [] ]]
Output: [Element 1, Element 2].
但是,我对函数的定义是不正确的:
flatten :: NestedList a -> [a]
flatten (Element a) = [a]
flatten (SubList (x:xs)) = flatten x ++ flatten (SubList xs)
flatten (SubList []) = []
根据这个定义,我的函数将像这样工作:
flatten (SubList [Element 1, SubList []])
而不是
flatten [Element 1, SubList []]
所以这个flatten不能接受我上面提到的输入,那么我应该如何定义flatten让它接受像[Element 1, SubList [Element 2, SubList []]]这样的输入?
【问题讨论】:
-
这不是你想要的定义吗?在我看来它工作得很好 - 结果将是
[1],如果你想将该结果的每个元素包装在Element(无论出于何种原因......),那么只需执行map Element . flatten。跨度> -
一个更简单的等效定义是将最后两个子句替换为
flatten (Sublist xs) = xs >>= flatten。 -
FWIW,
NestedList只是Free [],flatten只是来自instance Foldable f => Foldable (Free f)和instance Foldable []的toList。 -
如果这不是你想要的,你想要什么?
-
我的意思是我需要像 [Element 1, SubList []] 这样的输入而不是 SubList [Element 1, SubList []]。