这是permutations
HaskellData.List
模块中函数的代码:
permutations :: [a] -> [[a]]
permutations xs0 = xs0 : perms xs0 []
where
perms [] _ = []
perms (t:ts) is = foldr interleave (perms ts (t:is)) (permutations is)
where interleave xs r = let (_,zs) = interleave' id xs r in zs
interleave' _ [] r = (ts, r)
interleave' f (y:ys) r = let (us,zs) = interleave' (f . (y:)) ys r
in (y:us, f (t:y:us) : zs)
有人可以花时间向我解释这段代码是如何工作的吗?
我的困惑源于我非常习惯于编写没有外部依赖关系的函数(即使它们嵌套在另一个函数中),尤其是当它们是递归的时候。随着permutations
insideperms
和inside的存在t
,就函数的流程而言,我迷失了方向。ts
interleave'
谢谢!