2012-09-30 36 views
0

我面臨以下問題,有人可以給我一些提示嗎?非常感謝!如何在Haskell中定義一個while循環作爲高階函數?

定義高階函數while,其中條件和操作在a類型的值上工作。它的類型應該是

whileG :: (a -> IO Bool) -> (a -> IO a) -> (a ->IO a) 
+3

和你嘗試過什麼? –

+0

@DanielVelkov我對它沒有任何想法.. – Chwa

+0

上有哈斯克爾精彩教程一般IO尤其是浮動各地的網絡。也許你應該通過一兩個方法,然後再試一次。 –

回答

5

在像haskell這樣的語言中,你不一定需要循環。如果你這樣做,那意味着你試圖以一種命令式的方式實現你的想法,這並不總是正確的做法。

只是爲了把它剪短,因爲我沒有,你在做什麼想法,你可以看看loops庫,定義了幾個這樣的循環。

+2

我不同意這樣的斷言:Control.Monad.Loops是不是「Haskellish」。所有這些函數在使用一元代碼時都非常方便,特別是unfoldM是一種非常「功能性」的循環函數。 – Wes

+0

@哇好吧,也許我的語言錯了。我們有Control.Monad.Loops,因爲人們需要這些,但我的意思是說你不應該像命令式語言那樣總是嘗試使用循環。 – Satvik

1

看起來這是西蒙·湯普森的書函數式編程的工藝演習之一。我也努力解決這個問題,這就是我想出的,我絕不會聲稱這是最好的答案,但至少可以提供一個提示。

whileG :: (a -> IO Bool) -> (a -> IO a) -> (a -> IO a) 
whileG testIO action x = do 
    test <- testIO x 
    if test 
    then do 
     y <- action x 
     whileG testIO action $ y 
    else return x 

我在這裏假設一些計算是在「迴路」並在該計算這一結果的每次迭代中,其類型爲一完成,被輸入到兩個testIO功能(檢查是否循環不變仍然成立)以及下一次迭代中的動作。

+0

爲什麼遞歸調用中的'$'? – pat