我正在嘗試在 Haskell 中撰寫一個函式,它執行以下操作:您輸入一個整數串列,對于這些整數,使用 map,有一個函式應用于它們,回傳這些整數的無限串列。然后,我想使用 union 將 foldr 應用于串列串列,以便結果將是串列中這些串列的并集。
現在的問題是,當我做例如采取?? 10 'function' [1,2] 時,它會首先計算 1 的無限串列,并且因為它是一個無限串列,它永遠不會為 2 執行此操作。那么它僅回傳輸入串列中第一個元素的這個無限串列的前 10 個元素,并對其應用并集,這只是同一個串列。
我的問題是:有沒有辦法同時為輸入串列中的所有元素創建無限串列,例如,當我使用 10 個“函式”[1,2] 時,它將回傳前 10 個1 和 2 的無限串列的并集元素。(我不知道輸入串列中的元素數)
這是我的代碼,以使其更清楚:
pow :: Integer -> [Integer]
pow n = map (^n) [1, 2..]
function :: [Integer] -> [Integer]
function xs = foldr union [] (map pow xs)
uj5u.com熱心網友回復:
該union函式適用于任意串列并洗掉重復項,因此它必須首先完全評估其中一個引數,然后才能繼續處理另一個引數。
我認為您想明確引入串列已排序的假設,然后您可以撰寫一個有效的函式來合并(如合并排序中的合并)輸入串列并計算聯合,而無需在之前評估其中一個串列其他。
我不知道庫中是否存在這樣的合并函式,但您可以很容易地自己定義它:
-- | Computes the union of two sorted lists
merge :: Ord a => [a] -> [a] -> [a]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
| x <= y = x : merge (dropWhile (== x) xs) (dropWhile (== x) (y:ys))
| otherwise = y : merge (x:xs) (dropWhile (== y) ys)
然后,您使用此新merge功能的原始折疊應按預期運行:
ghci> pow n = map (^n) [1..]
ghci> function xs = foldr merge [] (map pow xs)
ghci> take 10 (function [2,3])
[1,4,8,9,16,25,27,36,49,64]
uj5u.com熱心網友回復:
如果您打算對輸入和輸出串列進行排序,請查看data-ordlist。如果您只想要所有元素但不關心順序,請嘗試concat . transpose.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343746.html
