Haskell用匿名函数折叠

And*_*ith 3 haskell anonymous-function fold

我有一个Haskell基础知识的问题:折叠+匿名函数

我正在开发一个bin2dec程序foldl.
解决方案如下所示:

bin2dec :: String -> Int
bin2dec = foldl (\x y -> if y=='1' then x*2 + 1 else x*2) 0
Run Code Online (Sandbox Code Playgroud)

我理解foldl/ 的基本思想,foldr但我无法理解参数的含义x y.

Sat*_*vik 7

看到的类型 foldl

foldl :: (a -> b -> a) -> a -> [b] -> a

考虑 foldl f z list

所以foldl基本上在列表上递增(或任何可折叠的),从左边取1个元素并应用f z element以获得新元素用于下一步,同时折叠其余元素.基本上,foldl的一个简单定义可能有助于理解它.

 foldl f z []     = z
 foldl f z (x:xs) = foldl f (f z x) xs
Run Code Online (Sandbox Code Playgroud)

来自Haskell wiki的图表可能有助于建立更好的直觉.

foldl fz

考虑你的功能,f = (\x y -> 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']
Run Code Online (Sandbox Code Playgroud)

现在f是一个带有2个参数的函数,第一个是整数,第二个是一个字符并返回一个整数.所以在这种情况下x=0y='1',所以f x y = 0*2 + 1 = 1

= foldl f 1 ['1']
= foldl f (f 1 '1') []
Run Code Online (Sandbox Code Playgroud)

现在再次申请f 1 '1'.这里x=1y='1'如此f x y = 1*2 + 1 = 3.

= foldl f 3 [] 
Run Code Online (Sandbox Code Playgroud)

使用foldl空列表的第一个定义.

= 3 
Run Code Online (Sandbox Code Playgroud)

这是"11"的十进制表示.