gpt4 book ai didi

haskell - 您可以仅使用列表单子(monad)来确定列表的最小值或最大值吗?

转载 作者:行者123 更新时间:2023-12-05 00:11:35 25 4
gpt4 key购买 nike

试图理解 Monad 和 Foldable 之间的关系。我知道 Monad、Applicative 和 Functor 类型类的部分值(value)在于它们能够将函数提升到结构之上,但是如果我想为 Monad 中包含的值生成一个汇总值(例如最小值或最大值)怎么办?

如果没有累加器权利(如可折叠),这将是不可能的吗?为了拥有一个蓄能器,你必须注入(inject)或破坏结构?

min :: Ord a => a -> a -> a

foldMin :: (Foldable t, Ord a) => t a -> Maybe a
foldMin t = foldr go Nothing t
where
go x Nothing = Just x
go x (Just y) = Just (min x y)

这里,Nothing 值是累加器。因此,不可能在 do 的范围内执行产生这样的汇总值的操作。堵塞?

最佳答案

我不完全确定我理解这个问题,所以如果这不是一个有用的答案,请原谅我,但据我了解,问题的核心是:

So it would not be possible to do an operation that produces a summary value like this within the confines of a do block?



没错,那是不可能的。 Haskell 的 do符号是 Monad 上的语法糖, 所以基本上语法糖超过 >>=return .
return ,如您所知,不会让您“访问” Monad 的内容。 ,因此对您拥有的内容的唯一访问是通过 >>= ,例如,在 list monad 的情况下,它一次只给你一个值。

请注意 Foldable甚至不需要数据容器是 Functor (更不用说 Monad 了)。众所周知, Set不是 Functor实例,但它是 Foldable实例。

例如,您可以找到一组中的最小值:
Prelude Data.Foldable Set> foldr (\x -> Just . maybe x (min x)) Nothing $ Set.fromList [42, 1337, 90125, 2112]
Just 42

关于haskell - 您可以仅使用列表单子(monad)来确定列表的最小值或最大值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235661/

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