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.
看到的类型 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的图表可能有助于建立更好的直觉.

考虑你的功能,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=0和y='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=1和y='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"的十进制表示.