Tag: 差异列表

为什么差异列表比常规连接更有效?

我现在正在通过在线学习你一个haskell书籍,并且已经到了一个章节,作者正在解释一些列表连接可能是不够的:例如 ((((a ++ b) ++ c) ++ d) ++ e) ++ f 据说效率不高。 作者提出的解决scheme是使用定义为“差异列表” newtype DiffList a = DiffList {getDiffList :: [a] -> [a] } instance Monoid (DiffList a) where mempty = DiffList (\xs -> [] ++ xs) (DiffList f) `mappend` (DiffList g) = DiffList (\xs -> f (g xs)) 我很难理解为什么在某些情况下DiffList在计算上比简单的级联更有效率。 有人能够简单地向我解释为什么上面的例子效率很低,DiffList以什么方式解决了这个问题?

在Prolog中展开列表

我只在Prolog工作了几天。 我了解一些事情,但这真让我困惑。 我想写一个函数,它需要一个列表并将其弄平。 ?- flatten([a,[b,c],[[d],[],[e]]],Xs). Xs = [a,b,c,d,e]. % expected result 该函数取出列表的内部结构。 这是我迄今为止: flatten2([],[]). flatten2([Atom|ListTail],[Atom|RetList]) :- atom(Atom), flatten2(ListTail,RetList). flatten2([List|ListTail],RetList) :- flatten2(List,RetList). 现在,当我打电话时, ?- flatten2([a,[b,c],[[d],[],[e]]], R). R = [a,b,c,d,e]. % works as expected! 但是当我打电话来查看我input的列表是否已经变平时,返回false而不是true : ?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]). false. % BAD result! 它为什么一方面工作,而另一方面呢? 我觉得我错过了很简单的事情。