簡體   English   中英

需要幫助了解 Haskell id function

[英]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 = 3fx = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM