【发布时间】:2013-01-21 19:35:09
【问题描述】:
我正在处理 python 挑战中的linkedlist 问题,需要查询下一个值(猜猜它是 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]
我认为它应该是迭代的单子提升版本,并从 Control.Monad.Loops 找到了iterateM_,但它没有按我预期的那样工作。没有显示(我认为_后缀意味着丢弃结果但没有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]
【问题讨论】:
-
你怎么知道什么时候找到答案?您在寻找特定的价值吗?
-
@sabauma 我不知道,但我想是的。这就像一个益智游戏。你可以从第一个任务开始here