我正在嘗試在 Haskell 中重做以下(簡化的)python 示例
zerosList = [0,0,0,0,0,0,0,0,0,0]
for number in range(1,10):
if (number & 1) == 0:
for index in range(number,9,2):
zerosList[index] = zerosList[index] 1
我們將串列中的一些值從 更改[0,0,0,0,0,0,0,0,0,0]為[0,0,1,0,2,0,3,0,4,0]。
我想我必須使用一些filters 來捕獲偶數,然后可能在某處使用 amap或 a foldl......但無法弄清楚如何組裝整個東西。類似的東西?
zeros = take 10 $ cycle [0]
numbers = [1..10]
foldl ( ) zeros $ filter even numbers
或者那個?
zeros = take 10 $ cycle [0]
numbers = [1..10]
map ( $ filter even numbers) zeros
好吧,這些都不起作用,所以我顯然走錯了路。也許我應該寫一個 replaceAt 函式?
uj5u.com熱心網友回復:
獲得你想要的輸出串列最直接的方法是觀察它是非常可預測的:它只是[0..4]和的交錯repeat 0。
concat $ zipWith (\a b -> [a, b]) [0..4] (repeat 0)
您可能會反對說這并沒有實作您的演算法,它正在利用您對真實資料中不存在的簡化的一些見解。好吧,太糟糕了,我會說。將命令式演算法移植到函式式語言通常需要以不同的方式思考問題。如果我的解決方案過于專業而無法滿足您的實際輸入,請考慮提供更真實的輸入。
uj5u.com熱心網友回復:
你可能想多了。當您了解模式匹配串列的作業原理時,這將變得相當簡單。
replace :: Int -> [Int] -> [Int]
replace _ [] = []
replace i [x] = [i]
replace i (x:y:xs) = i : y : replace (i 1) xs
我們可以匹配一個空串列,這顯然應該回傳一個空串列。由于該模式是每個偶數索引都被一個遞增的數字替換,從 開始0,我們知道一個具有單個元素的串列只是被一個具有遞增 int 的串列替換。
現在,我們還可以模式匹配串列的前兩個元素和尾部。我們只需用遞增的 int 替換第一個,不要修改第二個,并將其全部用于呼叫尾部函式的結果,同時將 int 遞增 1。
ghci> replace 0 [0,0,0,0,0,0,0,0,0,0]
[0,0,1,0,2,0,3,0,4,0]
傳入初始零很容易被隱藏。
replace :: [Int] -> [Int]
replace = replace' 0
where
replace' _ [] = []
replace' i [x] = [i]
replace' i (x:y:xs) = i : y : replace' (i 1) xs
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/530207.html
標籤:列表哈斯克尔
