这个Haskell如何使用列表理解工作来计算排列?

时间:2010-08-07 22:15:54

标签: haskell permutation list-comprehension

我正在阅读Simon Thompson的 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.1转到exe.2

2 个答案:

答案 0 :(得分:4)

好吧,它只是将23分别插入[2,3] \\ [x]。你有

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

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

答案 1 :(得分:4)

基本上说:

  1. 从列表xxs
  2. 中选择x <- xs
  3. ps列表xs\\[x]的排列(即xs已删除x) - perms ( xs\\[x] )
  4. 返回结果。
  5. perms(xs\\[x])是从x删除xs的递归调用。