2016-05-04 14 views
0

だから私の修正ポイントを見つけることができません、それは49までの整数をインクリメントし、その後、関数は常に50修正ポイント機能は<code>Control.Monad.State</code>、<code>fix :: (a -> a) -> a</code>から、私は<code>modifyValue</code>にこの小さなコードを持って、<code>fix</code>機能を理解するよう

返します私はこのコードを起動したときに
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>>

私が最初のを提供していないので、私は何かを間違えることは明らかであると主張しますシーケンスを開始するための状態、たとえばw ith 1、それは生成するでしょう[2,3,4,..,49,50,50,50,50....]

私は不適切に修正機能を使用していますか? 修正ポイント50を見つけることができるので、何かしますか?

+0

C.F.のようなものが必要になりますhttp://stackoverflow.com/q/4787421/356440 –

答えて

2

fixはこのような何かを定義している:

fix f = let x = f x in x 

をので、それはリストとして正常に動作

fix (1:) == 1:1:1:1:.... 

は怠け者だ怠け者データ構造のための再帰を生成するために良いことだので(そうtake 10 $ fix (1:)は完璧ですファイン)

あなたのような再帰関数から厳密な値を引き出すのはあまり良くありません。

それを印刷/評価したい場合は、すぐに値を提示する必要があります。これは無限ループで終了します。

おそらく

fixEq f x = let x' = f x in if x' == x then x else fixEq f x' 
関連する問題