我面臨以下問題,有人可以給我一些提示嗎?非常感謝!如何在Haskell中定義一個while循環作爲高階函數?
定義高階函數while
,其中條件和操作在a
類型的值上工作。它的類型應該是
whileG :: (a -> IO Bool) -> (a -> IO a) -> (a ->IO a)
我面臨以下問題,有人可以給我一些提示嗎?非常感謝!如何在Haskell中定義一個while循環作爲高階函數?
定義高階函數while
,其中條件和操作在a
類型的值上工作。它的類型應該是
whileG :: (a -> IO Bool) -> (a -> IO a) -> (a ->IO a)
在像haskell這樣的語言中,你不一定需要循環。如果你這樣做,那意味着你試圖以一種命令式的方式實現你的想法,這並不總是正確的做法。
只是爲了把它剪短,因爲我沒有,你在做什麼想法,你可以看看loops庫,定義了幾個這樣的循環。
看起來這是西蒙·湯普森的書函數式編程的工藝演習之一。我也努力解決這個問題,這就是我想出的,我絕不會聲稱這是最好的答案,但至少可以提供一個提示。
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功能(檢查是否循環不變仍然成立)以及下一次迭代中的動作。
爲什麼遞歸調用中的'$'? – pat
和你嘗試過什麼? –
@DanielVelkov我對它沒有任何想法.. – Chwa
上有哈斯克爾精彩教程一般IO尤其是浮動各地的網絡。也許你應該通過一兩個方法,然後再試一次。 –