簡體   English   中英

Haskell用匿名函數折疊

[英]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的圖表可能有助於建立更好的直覺。

foldl f z

考慮你的函數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=0y='1' ,所以fxy = 0*2 + 1 = 1

= foldl f 1 ['1']
= foldl f (f 1 '1') []

現在再次應用f 1 '1' 這里x=1y='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.

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