我在 python 挑战中玩链表问题,需要查询下一个值(猜它是 Int)。
我创建函数来获取下一个值,如下所示
url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
getNext :: Int -> IO Int
getNext x = do
rsp <- simpleHTTP (getRequest $ url ++ show x)
bdy <- getResponseBody rsp
let num = last $ splitWhen (==' ') bdy
return (read num::Int)
它工作正常(在ghci中)
> getNext 12345
44827
> getNext 44827
45439
虽然我想反复调用getNext 直到找到答案,但我认为我应该像在非单子世界中那样保留历史记录,这样我就可以从最后一个值继续,以防万一发生故障。
> let nX x = x + 3
> :t nX
nX :: Num a => a -> a
> take 10 $ iterate nX 1
[1,4,7,10,13,16,19,22,25,28]
我认为它应该是iterateM_
从 Control.Monad.Loops 中找到的迭代的单子提升版本,但它没有按我预期的那样工作。没有显示(我认为 _ 后缀意味着丢弃结果但没有iterateM)
> :t iterate
iterate :: (a -> a) -> a -> [a]
> :t iterateM_
iterateM_ :: Monad m => (a -> m a) -> a -> m b
问题是我怎样才能像在非单子迭代中那样获得 [Int] 。我想我想要一个返回的函数IO [Int]
能够像这样在我的代码中提取和过滤/处理
main = do
i <- getAllList
let answer = last i -- or could be a repeated converged value, don't know yet
putStrLn (show answer)
getAllList :: IO [Int]