所以我正在學習 Haskell 的課程,并且遇到了用 foldr 函式定義長度函式
因此,由于長度不是原始遞回函式,因此我們必須對傳遞給它的“運算子”進行更具體的說明,并且在此程序中,最終結果是這樣的:
len :: [a] -> Int
len = foldr (\_ n -> n 1) 0
我想我理解最終結果,但我真的需要澄清 lambda 函式的簽名:
- 下劃線引數應該是我們不關心的值
- n 引數是前一次呼叫的回傳值
我這樣想是對的嗎?或者正在發生一些不同的事情?
uj5u.com熱心網友回復:
你的假設是正確的:
- 我們不關心串列的元素,所以我們可以忽略它們并用下劃線清楚地表明這一點。
- 的
n的確是函式的前一個呼叫的回傳值。也可以命名acc為accumulator,含義更明確。
準確地說,正如 Carl 指出的那樣,在 的情況下foldr,n是對串列元素的函式嵌套呼叫的重擊,如果求值,則執行遞回求值。因此n成為對 的遞回呼叫的結果foldr。
用于可視化目的:
-- how `foldr ( ) 0 [1..5]` unfolds
λ> foldr (\x y -> "( " x " " y " )") "0" $ map show [1..5]
"( 1 ( 2 ( 3 ( 4 ( 5 0 ) ) ) ) )"
-- how `foldl ( ) 0 [1..5]` unfolds
λ> foldl (\x y -> "( " x " " y " )") "0" $ map show [1..5]
"( ( ( ( ( 0 1 ) 2 ) 3 ) 4 ) 5 )"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339378.html
標籤:哈斯克尔
上一篇:帶字符的Haskell型別推斷
