我面临以下问题,有人可以给我一些提示吗?非常感谢!如何在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尤其是浮动各地的网络。也许你应该通过一两个方法,然后再试一次。 –