这很可能是一个寻找问题的解决方案。。。如果是这样,我请求你的原谅
可能的实施:
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或其他实现?如果有的话,底层的数学是什么样的(例如,这是一个半群、一个循环等)?
我找到了一个完全不同的答案,那就是LogicT
monad转换器。其定义为:
lnot :: MonadLogic m => m a -> m ()
反转逻辑计算。如果m
至少有一个值成功,lnot m
失败。如果m
失败,则lnot m
会使值()
成功。
我相信这正是你想要的。
我有一个通用的解决方案,但它只适用于遵守左捕获定律的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()-
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类型或想将OADate转换为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容器中。但