当前位置: 首页 > 知识库问答 >
问题:

如何将失败的计算转换为成功的计算,反之亦然

姜煌
2023-03-14

这很可能是一个寻找问题的解决方案。。。如果是这样,我请求你的原谅

可能的实施:

class Switch' f where
  switch :: f a -> f ()

instance Switch' [] where
  switch []     = [()]
  switch (_:_)  = []

instance Switch' Maybe where
  switch Nothing   = Just ()
  switch (Just _)  = Nothing

这样的解释是:如果计算成功,就让它失败;如果计算失败,就让它成功。我不确定,但这似乎有点像MonadPlus的反面。。。如果你眯起眼睛真的很难???

这个概念有没有标准的typeclass或其他实现?如果有的话,底层的数学是什么样的(例如,这是一个半群、一个循环等)?

共有3个答案

阴凯歌
2023-03-14

我找到了一个完全不同的答案,那就是LogicTmonad转换器。其定义为:

lnot :: MonadLogic m => m a -> m ()

反转逻辑计算。如果m至少有一个值成功,lnot m失败。如果m失败,则lnot m会使值()成功。

我相信这正是你想要的。

廖华翰
2023-03-14

我有一个通用的解决方案,但它只适用于遵守左捕获定律的MonadPlus实例(这可能只是一个必要条件,而不是充分条件):

isZero :: (MonadPlus m) => m a -> m Bool
isZero x = (x >> return False) `mplus` return True

switch :: (MonadPlus m) => m a -> m ()
switch x = isZero x >>= \r -> if r then return () else mzero

它也适用于STM

(但对于列表,它总是返回[()],我想说,这个定义不适用于任何左分布。)

不可能以这种方式为应用程序定义它,因为开关检查isZero的值,而应用程序不能这样做。并且,满足左捕获规则的MonadPlus实例很少满足应用程序规则。)

不管怎样,看看是否切换会很有趣。(切换:: m()-

漆雕唯
2023-03-14
switch :: (Alternative f, Eq (f a)) => f a -> f ()
switch x | x == empty = pure ()
         | otherwise = empty

switch :: (MonadPlus m, Eq (m a)) => m a -> m ()
switch x | x == mzero = return ()
         | otherwise = mzero
 类似资料:
  • 问题内容: 如果我有一个如下所示的SQL表,该如何计算当前的赢或输连胜(以及按季节对赢/输连胜进行分组/重置)。我想更新表并为每条记录填写条纹。 因此,对于#1,条纹将为“ -1”,#2将为“ 1”,#3将为“ 2”,但是一旦我们降至#7,它将再次重置为“ 1”。(+1表示“赢得1场比赛”,-1表示“失去1场比赛”,依此类推。) 问题答案: 对于每个游戏,计算与之前结果相同的游戏,这样就不会有中间

  • 问题内容: 我正在搜索轻量级API(最好是单个类)以转换 到xml,反之亦然,将XML转换回Map。 例: 结果: 然后回来: 我不想使用JAXB或JSON转换API。只需简单的情况,它就不必处理嵌套的地图或属性或其他任何内容。有什么建议么? 编辑:我创建了一个工作副本并粘贴示例。感谢fvu和Michal Bernhard。 下载最新的XStream框架,“仅核心”就足够了。 不需要转换器或其他任

  • 好的,我有三个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。 我还有一个话题要讲 我可以将ModelMapper注入TopicService,并使用它进行转换,但它不能按照我的需要工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryTo将为null,但在调试中,在转换之前,在Topic对象中,Catego

  • 问题内容: 我想将Java Date转换为Microsoft OLE Automation-OADate类型或想将OADa​​te转换为Java Date。OADate for Java的公式是什么?实际上,我已经在stackoverflow中进行了搜索,但是找不到答案,我得到了答案,并且想在这个社区中分享它。 例如: 43013.7659837837963 等于 EET 2017年10月5日星期

  • 问题内容: 我在文件中定义了一个Point对象,如下所示: 现在,当我使用JSON通过以下代码将对象转换为JSON时: 我收到以下错误: 如何使用JSON模块在JSON与对象之间进行转换? 问题答案: 警告会告诉您大部分错误。除非您告诉 如何处理 祝福的 引用(Perl对象),否则 仅处理非祝福的数据结构。 你可以,你可以。对于,它说: 如果为false(默认值),则编码在遇到受祝福的对象时将引发

  • 问题内容: 实际上,我正在使用图像编辑软件,现在我想转换缓冲图像,即: 到图像即格式如下: 有可能吗?如果是,那怎么办? 问题答案: BufferedImage 是一个(n) 图像,因此您可以直接在第二行中进行隐式转换。如果您知道一个Image确实是一个BufferedImage,则必须像下面这样显式地强制转换它: 因为BufferedImage扩展了Image,所以它可以放入Image容器中。但