2

私はここで取り組んでいたプロジェクトに取り組んでいます:

do ブロックを早期に戻すにはどうすればよいですか?

関数でモナドトランスフォーマーメソッドを使用すると、次のようになります。

scrapePost :: String -> IO ()                                                   
scrapePost url = liftM (fromMaybe ()) . runMaybeT $ do
  doc <- lift $ fromUrl url
  -- get a bunch of stuff from the page 
  -- send it to the db
  replies <- lift . runX $ doc >>> css ".post.reply"
  -- here is the problem
  mapM_ (parseReply url (fromJust page_id)) replies
  -- here is the problem

parseReply必要な機能ですが、正しく取得できないようです。

その機能を開始するための私の弱い試みは次のとおりです。

parseReply :: String -> String -> XNode -> Maybe ()                                
parseReply url op_id reply = do                                                    
  reply_id <- runX $ reply ! "id"                                                     
  return ()                       

ところで、私はHandsomeSoupを使用しています

設定された css ルールを使用して関数と同じように動作しscrapePost、すべての値を持たない応答をスクレイピングしてドロップし、それらをデータベースに送信します。

mapM全部交換しmapMliftIO性能差を見たいので使ってみたいです。

[アップデート]

したがって、タイプのアクロバットを行う必要はなく、返信ノードをここで見つけたルート ノードに変換する方法が必要でした。

はコンテキストでparseReplyのみ使用されるため、その型は変更する必要がなく、同じままでかまいません。MaybeT IO ()scrapePost

parseReplyになります:

toRoot :: ArrowXml a => XmlTree -> a n XmlTree                                     
toRoot node = root [] [constA node]                                                

parseReply :: String -> String -> XmlTree -> MaybeT IO ()                          
parseReply url op_id reply = do                                                    
  let node = toRoot reply                                                        
  reply_id <-  lift . liftM (`atMay` 0) $ runX $ node >>> css "div" ! "id"
  guard (isJust reply_id)                                                        
  return ()
4

1 に答える 1

5

「モナドランナー」のタイプを見てみましょう

liftM (fromMaybe ()) . runMaybeT :: MaybeT IO () -> IO ()

そのため、do ブロックの各行に type が必要ですMaybeT IO ()。だけでなく型mapM_ :: (a -> m b) -> [a] -> m ()を持つparseReply url (fromJust page_id)必要があるので。MaybeT IO ()Maybe ()

Maybe幸いなことに、希望するかもしれませんが、ピュアを注入するのは簡単ですMaybeT IO

parseReplyT :: Monad m => String -> String -> XNode -> MaybeT m ()
parseReplyT url op_id = MaybeT . return . parseReply url op_id
于 2013-04-22T22:28:35.030 に答える