【发布时间】:2012-10-20 06:20:06
【问题描述】:
这很可能是一个寻求问题的解决方案......如果是这样,我请求你的宽容!
可能的实现:
class Switch' f where
switch :: f a -> f ()
instance Switch' [] where
switch [] = [()]
switch (_:_) = []
instance Switch' Maybe where
switch Nothing = Just ()
switch (Just _) = Nothing
解释是:给定一个成功的计算,让它失败;给定一个失败的计算,让它成功。我不确定,但这似乎与 MonadPlus 正好相反……如果你眯着眼睛真的很用力的话。 ???
这个概念有标准类型类或其他实现吗?如果有的话,底层数学会是什么样子(即这是一个半群、一个循环等)?
【问题讨论】:
-
switch几乎是二阶元素 - 它几乎是自逆的,因为switch.switch.switch=switch.switch。它最终生成重复的轨道(尽管最终是正确的词,但在提到等待 1 次迭代时听起来很长)。switch.switch是幂等的。这就是我刚才想在 switch 上抛出的所有数学。 -
是什么让
[()]更适合返回,而不是[(),()..]? -
它是
return (),和另一个例子一样。 -
@AndrewC 也许法律规定
switch专用于m () -> m ()是involution。 -
@PetrPudlák 是的,我认为这是完美的表达方式。好决定。由于
switch :: Switch m => m a -> m (),我们知道switch x :: m (),所以我说的所有这些都自动保留。非常整洁。对合也是一个比我使用的更好的术语。
标签: haskell typeclass alternative-functor monadplus