1

私は関数型プログラミングの新機能です。私はScalpelを使ってウェブサイトを削っており、そのウェブサイトに含まれているリンクから情報を抽出する必要があります。私が推測することはリンクの一部に過ぎず、これらのリンクのそれぞれに文字列"http://www.google.com/"を追加する必要があります。私はStringのリストを持っていないので、普通の++はできません。HaskellのMonadsのリストに文字列を追加するにはどうすればいいですか?

{-# LANGUAGE OverloadedStrings #-} 

import Text.HTML.Scalpel 

main :: IO() 
main = do 
    res <- scrapeURL "http://www.whateverLink/" scrapeComic 
    print res 

scrapeComic :: Scraper String [[String]] 
scrapeComic = 
    chroots ("ul" @: ["id" @= "research-teachinglist"]) scrapeLink 

scrapeLink :: Scraper String [String] 
-- This returns me the parts of the links I want 
scrapeLink = (attrs "href" "a") 

-- I tried this, but it doesn't work 
-- scrapeLink = mapM_ ("http://www.google.com/" ++) (attrs "href" "a") 

任意のアイデア:

ここでは、コードですか?

はあなたが

attrs "href" "a" :: Scraper String [String] 

("http://www.google.com/" ++) :: String -> String 

を持っていて、の元結果リスト内のすべての Stringの要素に、後者を適用したい

+4

'FMAP(マップにつながる

fmap (map ("http://www.google.com/" ++)) :: Scraper String [String] 

を持っています( "http://www.google.com/" ++))scrapeLink'がありますが、typeclassopediaをご覧ください。この質問は多かれ少なかれ、SOのトピックではないモナドチュートリアルを求めています。 – Zeta

+0

それはうまくいった!モナドチュートリアルをいくつか見ていきます。ありがとう – BourbonCreams

答えて

1

ありがとうございます。

まず第一に、リストにそれを適用すると、あなたのケースでそう

map :: (a -> b) -> [a] -> [b] 

の問題であり、あなたが一歩近づく私たちを取得します

map ("http://www.google.com/" ++) :: [String] -> [String] 

を持っています。

次に、純粋な[String]値の代わりに、Scraper String [String]という計算があります。しかしながら、strの任意の選択、特にstr ~ StringについてのScraper str is an instance of Functor、すなわちScraper StringFunctorである。それが私たちを与えるもの

Scraper String sの純粋な関数を適用する方法です。特に

fmap :: (a -> b) -> Scraper String a -> Scraper b 

、我々は

scrapeLink :: Scraper String [String] 
scrapeLink = fmap (map ("http://www.google.com/" ++)) (attrs "href" "a") 
関連する問題