【发布时间】:2014-03-02 16:04:34
【问题描述】:
我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不会有未来的效果)。有这个的类型类吗?
这是否被 MonadFix 覆盖?看代码,似乎是这样,但我被wiki page吓跑了“很容易看到“递归”并猜测它意味着递归或重复执行动作。不。”
在我看来,不动点也是身份的对偶。也就是说,当与非身份结合时,身份会消失(0 表示 (+),1 表示 (*),[] 表示追加等)。而固定点会导致任何非固定点在下面的“放松”操作下消失。有没有办法将这种二元性形式化,这样做有用吗?即,MonadPlus 和/或 Monoid 与 MonadRelax 之间是否存在关系?
最后,我注意到放松几乎是一种展开/变形。这样表达会更好吗?
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
import Control.Monad.Loops (iterateUntilM) -- cabal install monad-loops
-- states that relax to a fixed point under step
class Monad m => MonadRelax m s | s -> m where
isFixed :: s -> Bool
step :: s -> m s -- often (not always): step s = return s iff isFixed s
relax :: MonadRelax m s => s -> m s
relax = iterateUntilM isFixed step
【问题讨论】:
-
step s == s的类型不是很好,但你可能有step s == return s,只要Eq a => Eq (m a)。另外,将fundep设为s -> m也很奇怪。 -
是的,我的意思是返回有点隐含。 Fundep 是如此 isFixed 可以查找它的实例,即使它没有提到类型 m(感谢 #haskell 上的 johnw)。
-
你的
relax操作,严格来说,不会“执行[e]一个动作,直到它停止产生效果”——它观察的是结果 的step,不一定是它的影响。您是否在做出将效果和结果等同起来的假设?如果是这样,您可能需要澄清这一点。 -
是的,我的意思是“停止具有某些效果”,这通常但不一定意味着改变结果。我猜在那种情况下,在(Eq s)下,mfix(或其他)可以自动找到固定点,我们不需要isFixed?不过,我不想将其限制在这种情况下。
-
我不明白为什么
MonadRelax比iterateUntilM好。事实上,情况似乎更糟;一旦我们知道它的类型,是否有理由相信只有一种好方法来步进值?
标签: haskell recursion fixpoint-combinators unfold monadfix