gpt4 book ai didi

list - (>>) 是否应该丢弃所有左侧输出?

转载 作者:行者123 更新时间:2023-12-04 00:03:32 25 4
gpt4 key购买 nike

我想我确实理解 list monad,但后来我发现我不是。这是故事。

给定列表m和功能 k

> let m = [1..10]
> :t m
m :: [Integer]

> let k = replicate 2
> :t k
k :: a -> [a]

玩绑定(bind) >>=给我所期望的
> :t (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
> :t m >>= k
m >>= k :: [Integer]
> m >>= k
[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]

但是对于 >>
预期(从体验 IO monad,左侧的所有内容都将被丢弃)
m >> m
[1,2,3,4,5,6,7,8,9,10]

得到
> :t (>>)
(>>) :: Monad m => m a -> m b -> m b
:t m >> m
m >> m :: [Integer]
> m >> m
[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5 ... 9,10] -- truncated, real output is 100 elements

请解释原因 >>不像我预期的那样表现(当然我一定有误解)以及解释 >>的正确方法是什么?

最佳答案

(>>)丢弃其第一个参数的值,但不丢弃效果。在这种情况下,可能更容易查看您是否使用不同类型的列表:

λ> "ab" >> [1,2,3,4]
[1,2,3,4,1,2,3,4]

注意第一个列表的值根本没有被使用。

记住 (>>) 的定义: a >> b = a >>= (\_ -> b) .所以这变成了 "ab" >>= (\_ -> [1,2,3,4]) ,即 concat (map (\_ -> [1,2,3,4]) ['a','b']) ,即 concat [[1,2,3,4],[1,2,3,4]] (还有 [i | _ <- "ab", i <- [1,2,3,4]] )。

[] , (>>=)意思是“为每个人”。右边的函数将左边的每个值作为参数。所以 (>>) ,它丢弃值,仍然意味着“每个”——但这次它不能使用该值,所以它只是意味着“第二个列表的元素,重复的次数与第一个列表中的元素一样多”。

关于list - (>>) 是否应该丢弃所有左侧输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14953032/

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