2010-08-07 20 views
7

我读西蒙·汤普森的的Haskell:函数式编程的工艺,我想知道是如何工作的:Haskell函数如何使用列表理解工作计算排列?

perms [] = [[]] 
perms xs = [ x:ps | x <- xs , ps <- perms (xs\\[x]) ] 

我似乎无法把握perms(xs\\[x])应如何发挥作用。两个元素的列表的跟踪显示:

perms [2,3] 
    [ x:ps | x <- [2,3] , ps <- perms ([2,3] \\ [x]) ]  exe.1 
    [ 2:ps | ps <- perms [3] ] ++ [ 3:ps | ps <- perms [2] ] exe.2 
    ... 

如何从exe.1exe.2

+0

为什么downvote? – 2010-08-07 22:21:26

+2

你知道吗,我是个白痴。这是我见过的关于列表理解的第一个跟踪。跟踪显示列表中的所有元素一次创建一个。我不知道为什么我认为第三行是要创建的列表的第二个元素。 – 2010-08-07 22:46:57

回答

4

它基本上是说:

  1. 采取任何x从列表xsx <- xs
  2. 采取ps是列表xs\\[x]的置换(即xs与删除x) - perms (xs\\[x])
  3. 返回结果。

perms(xs\\[x])是递归调用,从xs删除x

4

那么,它只是插入23分别到[2,3] \\ [x]。所以,你必须

[ 2:ps | ps <- perms ([2,3] \\ [2]) ] ++ [ 3:ps | ps <- perms ([2,3] \\ [3]) ] 

而且由于\\是差分算,即它返回其不在第二列表中的第一个列表的元素,结果分别为[3][2]