簡體   English   中英

這個Haskell如何使用列表理解工作來計算排列?

[英]How does this Haskell function to calculate permutations using list comprehension work?

我正在閱讀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.1exe.2

好吧,它只是分別在[2,3] \\\\ [x]插入23 所以你有了

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

並且由於\\\\是差值運算符,即它返回第一個列表中不在第二個列表中的元素,結果分別為[3][2]

它基本上說:

  1. 從列表xs取任何xx <- xs
  2. ps是列表xs\\\\[x]排列(即xs與刪除的x ) - perms ( xs\\\\[x] )
  3. 返回結果。

perms(xs\\\\[x])是從xs刪除x遞歸調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM