gpt4 book ai didi

haskell - map 。 foldr 函数组合 - Haskell

转载 作者:行者123 更新时间:2023-12-04 16:29:24 24 4
gpt4 key购买 nike

所以,让我们直奔主题。

:t (map.foldr)
(map.foldr) :: (a1 -> a -> a) -> [a] -> [[a1] -> a]

什么是 [[a1] -> a]?
我真的很想理解这个组合,所以我这样做了:
-- map.foldr

map.foldr :: (a1 -> a -> a) -> [a] -> [[a1] -> a]

map :: (a1 -> b1) -> [a1] -> [b1]
(.) :: (y -> w) -> (x -> y) -> x -> w
foldr :: (a -> b -> b) -> b -> [a] -> b

y = (a1 -> b1) w = ([a1] -> [b1])
x = (a -> b -> b) y = (b -> [a] -> b)

y = (a1 -> b1)
y = (b -> [a] -> b)
_________________________

在这一点上会发生什么?谢谢!

最佳答案

要回答这个问题,最好记忆一下 foldrmap做。

两者中比较复杂的是foldr , 它有类型

--              list to be folded
-- v
foldr :: (a -> b -> b) -> b -> [a] -> b
-- ^ ^
--folding function terminal value

要折叠的列表真的是一连串的conses (:)和一个终端空列表:
1 : 2 : 3 : []
foldr的行动|是替换 :[]分别具有折叠函数和终端值的构造函数:
foldr (+) 0 (1 : 2 : 3 : []) == 1 + 2 + 3 + 0
map功能更简单。一种思考方式是获取一个函数和一个列表,并将该函数应用于列表的每个参数:
map :: (a -> b) -> [a] -> [b]
-- ^ ^
-- function list

但是,您也可以将其视为一个函数,并将其提升为一个作用于列表的函数:
map :: (a -> b) -> ( [a] -> [b] )
-- ^ ^
-- function function on lists

组合这两个函数是什么意思, map . foldr ?请注意,这只是一个接一个地应用功能 - 特别是,
(map . foldr) f == map (foldr f)

既然你申请了 foldr首先,您必须将其应用于函数 f :: a -> b -> b ,然后你得到另一个函数:
foldr f :: b -> [a] -> b
-- ^ ^
--terminal val list to be folded

现在申请 map ,它提升了作用于列表的功能:
map (foldr f) :: [b] -> [[a] -> b]
-- ^ ^
--list of terminal vals functions that fold lists

这种类型看起来很奇怪,但它是有效的。现在不是单个终端值,而是给它一个终端值列表,然后返回一个折叠函数列表 - 一个用于您提供的每个终端值。

为了更清楚,我们可以查看一个特定的函数, (+) , 它有类型
(+) :: Num a => a -> a -> a

如果我们把它代入上面的等式,我们得到
(map . foldr) (+) :: Num a => [a] -> [[a] -> a]
-- ^ ^
-- list of terminal vals functions that fold lists

如果我们现在将它应用到列表 [0, 1, 2]我们得到三个函数的列表:
(map . foldr) (+) [0,1,2] :: Num a => [[a] -> a]

我们可以使用 map ($x)将列表中的每个函数应用于特定参数的习惯用法。它必须是一个数字列表,我会选择 [3,4,5] .仔细观察:
> map ($[3,4,5]) ((map.foldr) (+) [0,1,2])
[12, 13, 14]

名单 [3,4,5]使用 (+) 折叠了三次作为折叠函数,并且每次都有不同的终端值:
3 + 4 + 5 + 0 == 12
3 + 4 + 5 + 1 == 13
3 + 4 + 5 + 2 == 14

当终端值为 0 时,我们只需得到值的总和: 3 + 4 + 5 == 12 .当终端值为 1 时当最终值为 13 时,我们得到的值比总和多一 ( 2 )我们得到的值比值的总和多两个( 14)。

关于haskell - map 。 foldr 函数组合 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665268/

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