5

我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不可能有未来的效果)。有一个类型类吗?

这被 MonadFix 覆盖了吗?看代码,似乎是这样,但我被wiki 页面吓跑了“很容易看到‘递归’并猜测它意味着递归或重复执行动作。不。”

在我看来,固定点也像是身份的双重性。也就是说,当与非身份结合时,身份会消失(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
4

1 回答 1

1

你所要求的,实际上是一个简单的fix

cd :: (Monad m) => Int -> Int -> m Int
cd = fix (\f c i -> if i == 0 then return c else f (c+i) (i-1))

这将重复计算,直到i变为 0。(我添加c了一个有意义的计算;但您可以假设s=(Int,Int)其中一个是滚动总和,另一个是计数器)

> cd 0 4 :: [Int]
[10]

这与以下内容相同:

relax = fix (\f s -> if isFix s then return s else f (step s))

我相信,这就是iterateUntilM.

于 2014-02-07T09:34:44.167 回答