2012-09-30 25 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