您好,我有此功能的兩個版本,但遇到了一些問題。
iter :: Int -> (a -> a) -> (a -> a)
iter n f
| n > 0 = f . iter (n-1) f
| otherwise = id
iter' :: Int -> (a -> a) -> (a -> a)
iter' n = foldr (.) id . replicate n
即使在谷歌上搜索 id 在這里實際上做了什么之后,我也無法理解。
例如,如果我們使用n = 3and來處理函式f x = x 1。當我們遍歷整個程序n并到達id被呼叫的地步時,我們的變數會發生什么?
我是一個非常大的新手,所以請您盡可能簡單地解釋一下。
uj5u.com熱心網友回復:
總結一個串列xs = [x1,x2,...,xn]可以被可視化為
x1 x2 ... xn 0
請注意, 0在最后。它的目的是處理串列為空的情況,即xs = []和n=0。在這種情況下,上面的總和減少到0,這是空串列的正確總和。
還要注意,當串列不為空時,額外的 0對總和沒有影響,所以它是無害的。我們確實選擇,0因為它是加法的中性元素:x 0 = x對于所有x。
如果我們想計算一個乘積,我們會寫
x1 * x2 * ... * xn * 1
注意* 1最后。它的作用和 0上面看到的完全一樣。另請注意,這1是乘法的中性元素:x * 1 = x對于所有x.
如果我們想計算一個函式串列的組合,我們會寫
f1 . f2 . ... . fn . id
注意. id最后。它的作用 0和* 1上面看到的和完全一樣。還要注意的id是構圖的中性元素f . id = f所有f。
希望這會幫助你理解為什么,每次我們計算一個折疊時
x1 op x2 op ... op xn
whereop是任何二元運算,我們希望以... op neutral_elementso結束以處理空串列情況,并且仍然作為非空串列的良好基礎情況。
uj5u.com熱心網友回復:
您可以行內:
iter 3 f
f . iter 2 f
f . (f . iter 1 f)
f . (f . (f . iter 0 f)
f . (f . (f . id))
-- adding the argument x
iter 3 f x
(f . (f . (f . id))) x
-- using (g . h) x == g (h x)
f ((f . (f . id)) x)
f (f ((f . id) x))
f (f (f (id x)))
f (f (f x))
在以下情況下iter':
iter' 3 f
(foldr (.) id . replicate 3) f
foldr (.) id (replicate 3 f)
foldr (.) id [f, f, f]
(.) f (foldr (.) id [f, f]]
(.) f ((.) f (foldr (.) id [f]))
(.) f ((.) f ((.) f (foldr (.) id [])))
(.) f ((.) f ((.) f id))
f . (f . (f . id))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374154.html
上一篇:回傳函式回傳值最高的串列元素
