[英]Need help understanding Haskell id function
您好,我有這個 function 的兩個版本,我遇到了一些麻煩。
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 = 3
和fx = x+1
來到 function 。 當我們遍歷整個n
並到達調用id
的點時,我們的變量會發生什么?
我是一個非常大的新手,所以請您盡可能簡單地解釋一下。
您可以內聯:
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))
對列表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
. id
在最后。 它的作用與上面看到的+ 0
和* 1
完全一樣。 另請注意, id
是組合f. id = f
f. id = f
對於所有f
。
希望這將幫助您理解為什么,每次我們計算折疊時
x1 op x2 op ... op xn
其中op
是任何二元運算,我們希望以... op neutral_element
結尾,以便處理空列表情況,並且仍然作為非空列表的良好基礎情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.