私は。。をしようとしています
- CSV ファイルを読み込む
- ファイルから ID を読み取る
- ID ごとに外部 xml ファイルをロードする
- XML からいくつかの名前を読み取る
- IDと名前を新しいCSVファイルに書き出す
私はHaskellを初めて使用し、本当に学びたいと思っています.私はまだ理解のコピーと貼り付けの段階にあります. 各パーツのチュートリアルを個別に見つけましたが、それらを組み合わせるのに苦労しています。
CSV は次のように単純です。
736572,"Mount Athos"
6697806,"North Aegean"
CSV の読み取りにはCassavaを使用し、XML の読み取りにはHandsomeSoupを使用します。
ここでは、少なくとも id を読み取り、xml を読み込み、xml から名前を出力しようとしています。
{-# LANGUAGE ScopedTypeVariables #-}
import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V
import Text.XML.HXT.Core
import Text.HandsomeSoup
import Data.List
import Data.Char
getPlaceNames::String->String->String
getPlaceNames pid name = do
let doc = fromUrl ("http://api.geonames.org/get?geonameId="++pid++"&username=demo")
c<-runX $ doc >>> css "alternateNames" >>> deep getText
return (head c)
main :: IO ()
main = do
csvData <- BL.readFile "input.csv"
case decode NoHeader csvData of
Left err -> putStrLn err
Right v -> V.forM_ v $ \ ( pid, name ) ->
putStrLn $ getPlaceNames pid name
getPlaceNames を呼び出して名前を返すと、何か間違ったことをしていると思います。getPlaceNames で「do」ステートメントを使用する必要があるかどうかさえわかりません。
エラーは言う
Couldn't match expected type ‘[[Char]]’
with actual type ‘IO [String]’
In a stmt of a 'do' block:
c <- runX $ doc >>> css "alternateNames" >>> deep getText
In the expression:
do { let doc
= fromUrl
("http://api.geonames.org/get?geonameId="
++ pid ++ "&username=demo");
c <- runX $ doc >>> css "alternateNames" >>> deep getText;
return (head c) }
In an equation for ‘getPlaceNames’:
getPlaceNames pid name
= do { let doc = ...;
c <- runX $ doc >>> css "alternateNames" >>> deep getText;
return (head c) }
しかし、それはおそらく、モナドとバインディングを理解していないために私が間違っていることの 1 つにすぎません。
適切なドキュメントへの単なるポインタであっても、助けていただければ幸いです。
乾杯
ビョルン