如何在Haskell中将while循环定义为高阶函数?

时间:2012-09-30 05:04:35

标签: haskell

我面临以下问题,有人可以给我一些提示吗?非常感谢!

定义高阶函数while,其中条件和操作适用于a类型的值。它的类型应该是

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

2 个答案:

答案 0 :(得分:5)

在像haskell这样的语言中,你不一定需要循环。如果你这样做那意味着你正试图以强制性的方式实现你的想法,这并不总是正确的事情。

只是为了缩短它,因为我不知道你在做什么,你可以看看定义了几个这样的循环的loops库。

答案 1 :(得分:1)

看起来这是Simon Thompson的书“The Craft of Functional Programming”中的练习之一。我也在努力解决这个问题,这就是我提出的问题,我认为这绝不是最好的答案,但可能至少提供一个提示。

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

我假设在'循环'的每次迭代中都进行了一些计算,并且该计算的结果(类型为a)被输入到testIO函数(以检查循环不变量是否仍然成立) )以及下一次迭代中的动作。