【发布时间】:2016-08-30 09:59:20
【问题描述】:
为了理解fix函数,从Control.Monad.State,fix :: (a -> a) -> a,我在modifyValue中有这个小代码,它递增一个整数直到49,然后函数总是返回50。
import Control.Monad.State
type StateVal = Int
modifyValue :: StateVal -> StateVal
modifyValue v | v < 50 = v + 1
modifyValue v = 50
simpleStateStep :: State StateVal ()
simpleStateStep = do
s <- get
put $ modifyValue s
main = do
putStrLn $ show $ fix modifyValue
但是,当我启动此代码时,并没有在 50 处找到固定点,序列收敛到 50... 它声称 *** Exception: <<loop>>
很明显我犯了一些错误,因为我没有提供初始状态来启动序列,例如使用 1,这会生成 [2,3,4,..,49,50,50,50,50....]
我是否不恰当地使用了修复功能? 有什么办法让它可以找到固定点 50 吗?
【问题讨论】:
-
形式上,
fix返回函数中定义最少的不动点。50是一个固定点,undefined也是:modifyValue undefined产生undefined。由于undefined的定义比50少,所以这就是返回的内容。fix仅对没有undefined作为固定点的函数有用。
标签: haskell fixpoint-combinators