次の値を照会する必要がある 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]
それは iterate のモナドリフトバージョンであり、 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]