我是 Haskell 的新手,需要列出所有可能的方法來配對(偶數)Int 串列。
例如
[1,2,3,4] -> [[(1,2),(3,4)], [(2,3),(1,4)], [(1,3),(2,4)], ...]
生成所有可能的對很容易(如下所示),但我無法弄清楚如何只回傳配對整個輸入串列的方法。
pairs :: [a] -> [[(a, a)]]
pairs l = [(x,y) | (x:ys) <- tails l, y <- ys]
uj5u.com熱心網友回復:
我建議撰寫一個非確定性選擇元素的函式,同時回傳串列中的其余值。有幾個可能的 API;我在下面建議的一種是最通用的一種,我在很多場合都使用過這種方法來處理明顯不相關的任務。
zippers :: [a] -> [([a], a, [a])]
下面是這個函式的作用的一個例子:
> zippers "abcd"
[("", 'a', "bcd"), ("a", 'b', "cd"), ("ba", 'c', "d"), ("cba", 'd', "")]
一旦你有了它,你就可以簡單地從不斷縮小的可用選項串列中重復、非確定性地選擇一個元素,在每個其他選擇之后制作一個元素。
uj5u.com熱心網友回復:
我們可以使用一個輔助函式pick,該函式回傳一個 2 元組串列,其中第一個元素是選擇的專案,第二個元素是剩余元素的串列:
pick :: [a] -> [(a, [a])]
pick [] = []
pick (x:xs) = (x, xs) : …
該…部分應該pick使用串列的尾部呼叫,并將回傳的 2 元組的每個第二項添加到x.
使用此pick函式,我們可以構建所有組合:
pairs :: [a] -> [[(a, a)]]
pairs [] = [[]]
pairs (x:xs) = [(x,y):tl | (y, zs) <- pick xs, tl <- pairs zs]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365070.html
標籤:哈斯克尔
上一篇:以仆人和mtl風格流式傳輸
下一篇:GHC中函式引數的行內
