首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“Alternative”类型类中的“‘some”和“many”函数

“Alternative”类型类中的“‘some”和“many”函数
EN

Stack Overflow用户
提问于 2011-10-06 14:45:01
回答 2查看 2.6K关注 0票数 20

Alternative类型类中的函数somemany有什么用呢?Docs提供了一个我无法理解的递归定义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-07 06:39:23

somemany可以定义为:

代码语言:javascript
复制
some f = (:) <$> f <*> many f
many f = some f <|> pure []

看看some是如何用一元do语法编写的可能会有所帮助:

代码语言:javascript
复制
some f = do
  x <- f
  xs <- many f
  return (x:xs)

因此,some f运行f一次,然后“多次”运行,并收集结果。many f运行f“一些”次,或者“替代”只返回空列表。他们的想法是,他们都尽可能频繁地运行f,直到它“失败”,将结果收集到一个列表中。不同之处在于,如果f立即失败,则some f将失败,而many f将成功并“返回”空列表。但这一切到底意味着什么,取决于<|>是如何定义的。

它只对解析有用吗?让我们看看它对base中的实例:Maybe[]STM做了什么。

第一个MaybeNothing表示失败,因此some Nothing也失败,计算结果为Nothing,而many Nothing成功,计算结果为Just []some (Just ())many (Just ())永远不会返回,因为Just ()永远不会失败!在某种意义上,它们的计算结果是Just (repeat ())

对于列表,[]表示失败,因此some []的计算结果为[] (无答案),而many []的计算结果为[[]] (只有一个答案,它是空列表)。再说一次,some [()]many [()]没有返回。展开实例,some [()]表示fmap (():) (many [()])many [()]表示some [()] ++ [[]],因此您可以说many [()]tails (repeat ())相同。

对于STM,失败意味着必须重试事务。所以some retry会自己重试,而many retry只会返回空的列表。some fmany f将重复运行f,直到它重试。我不确定这是不是有用的东西,但我猜它不是。

因此,对于Maybe来说,[]STM manysome似乎没有那么有用。只有当应用程序具有某种状态,在反复运行相同的事情时,使失败的可能性增加时,它才是有用的。对于解析器,这是每次成功匹配时都会缩小的输入。

票数 44
EN

Stack Overflow用户

发布于 2011-10-06 15:12:29

例如,对于parsing (参见“通过示例进行应用解析”部分)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7671009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档