我面临以下问题,有人可以给我一些提示吗?非常感谢!
定义高阶函数while
,其中条件和操作适用于a
类型的值。它的类型应该是
whileG :: (a -> IO Bool) -> (a -> IO a) -> (a ->IO a)
答案 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函数(以检查循环不变量是否仍然成立) )以及下一次迭代中的动作。