[英]How to rewrite a fold with anonymous function in Haskell into a regular function?
[英]Haskell Fold with anonymous function
我有一個Haskell基礎知識的問題:折疊+匿名函數
我正在用foldl
開發一個bin2dec程序。
解決方案如下所示:
bin2dec :: String -> Int
bin2dec = foldl (\x y -> if y=='1' then x*2 + 1 else x*2) 0
我理解foldl
/ foldr
的基本思路,但我無法理解xy
代表的參數。
查看foldl
的類型
foldl :: (a -> b -> a) -> a -> [b] -> a
考慮foldl fz list
所以foldl基本上在列表上遞增(或任何可折疊的),從左邊取1個元素並應用fz element
以獲得新元素用於下一步,同時折疊其余元素。 基本上,foldl的一個簡單定義可能有助於理解它。
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
來自Haskell wiki的圖表可能有助於建立更好的直覺。
考慮你的函數f = (\\xy -> if y=='1' then x*2 + 1 else x*2)
並嘗試為foldl f 0 "11"
寫入跟蹤。 這里"11"
與['1','1']
foldl f 0 ['1','1']
= foldl f (f 0 '1') ['1']
現在f是一個帶有2個參數的函數,第一個是整數,第二個是一個字符並返回一個整數。 所以在這種情況下, x=0
, y='1'
,所以fxy = 0*2 + 1 = 1
= foldl f 1 ['1']
= foldl f (f 1 '1') []
現在再次應用f 1 '1'
。 這里x=1
且y='1'
因此fxy = 1*2 + 1 = 3
。
= foldl f 3 []
使用foldl
的第一個定義為空列表。
= 3
這是“11”的十進制表示。
使用類型! 您可以在GHCi中鍵入:t
,后跟任何函數或值以查看其類型。 如果我們詢問foldl
的類型,會發生什么
Prelude> :t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a
輸入列表的類型為[b]
,因此它是b
的列表。 輸出類型是a
,這是我們要生成的。 您還必須提供折疊的初始值,也是類型a
的初始值。 該功能屬於類型
a -> b -> a
第一個參數( a
)是到目前為止計算的折疊的值。 第二個參數( b
)是列表的下一個元素。 所以在你的例子中
\x y -> if y == '1' then x * 2 + 1 else x * 2
參數x
是你到目前為止計算的二進制數, y
是列表中的下一個字符( '1'
或'0'
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.