gpt4 book ai didi

带有匿名函数的 Haskell Fold

转载 作者:行者123 更新时间:2023-12-02 21:31:50 24 4
gpt4 key购买 nike

我对 Haskell 基础知识之一有疑问:Fold + 匿名函数

我正在使用 foldl 开发 bin2dec 程序。
解决方案如下所示:

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

我理解 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

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

foldl f z

考虑你的功能 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']

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

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

现在再次申请f 1 '1' 。这里x=1y='1'所以f x y = 1*2 + 1 = 3 .

= foldl f 3 [] 

使用 foldl 的第一个定义对于空列表。

= 3 

这是“11”的十进制表示形式。

关于带有匿名函数的 Haskell Fold,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com