私は現在、ウェブサイトを分析し、このウェブサイトに属するすべてのリンク(href)を見つけようとしているハスケルのこのプログラムに取り組んでいます。私は既にメインサイトのすべてのリンクを抽出することができましたが、私はすでに見つかったリンクをたどり、同じプロセスをやり直したいので、私は再帰に苦労しています。ハスケルの再帰的リスト機能
これは私がすでに持っているものです。
parseHtml = fmap LB.unpack . simpleHttp
filterFunc x y = -- damn long line with a lot of filters
main :: IO()
main = do
let site = "https://stackoverflow.com/"
url <- parseHtml site
let links = filterFunc site url
mapM_ print $ take 5 $ links
そして、これはこれまでのところ、私の出力です:
"https://stackoverflow.com/company/about"
"https://stackoverflow.com/company/work-here"
"https://stackoverflow.com/help"
"https://stackoverflow.com/jobs/directory/developer-jobs"
"https://stackoverflow.com/questions/44691577/stream-versus-iterators-in-set"
私はちょうどさらに進行すると、すでに見つかっを訪問する方法をどのようにヒントを必要とします再度リンクします。私は折りたたんで作業する必要がありますか?
あなたは '[URL]'の代わりに 'Set URL'を使いたいかもしれません。両方の効率と、これはあなたがそのリストの周りを守るときに意味するものなので。 – gallais
このコードスニペットは、私のfilterfunc 'Set.toListにあります。 Set.fromList'を使用して、すべての重複を取り除きます。私はちょうどそれを使用して簡単にするためにセットとしてそれを保持する必要がありますか? –
@gallaisが指摘しているように、おそらくこれは 'Set'として保存するのが最も簡単なオプションです。注意すべきもう一つのことは、異なる名前を持つリンクが同じページを指している可能性があるため、それらの正規表現を取得することが賢明かもしれません。 –