0
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric, ScopedTypeVariables #-}

import Data.Generics (Data, Typeable)
import Data.Conduit
import qualified Data.Conduit.List as CL
import Database.CouchDB.Conduit.Generic
import Database.CouchDB.Conduit
import Database.CouchDB.Conduit.View
import Data.ByteString.Char8 (ByteString, empty)
import Control.Monad.IO.Class (liftIO)
import Data.Aeson
import Data.Aeson.Types
import GHC.Generics

data Page = Page { id_ :: ByteString, url :: ByteString }
            deriving (Show, Data, Typeable, Generic)

instance FromJSON Page

getPages :: IO ()
getPages = runCouch (def { couchHost = "192.168.0.103" }) $ do
    couchView_ "reader" "reader" "pages" [] $ CL.mapM_ (liftIO . print)

これは機能し、私にこれを与えます:

    *Main> getPages 
    fromList [("key",String "802e343945c7f8da2d8a71fdb80025a7"),("id",String "802e343945c7f8da2d8a71fdb80025a7"),("value",String "http://yandex.ru")]`

しかし、私は実際に関数が欲しいgetPages :: IO [Page]ので、これを試しました:

getPages = runCouch (def { couchHost = "192.168.0.103" }) $ do
    couchView_ "reader" "reader" "pages" [] $ toType =$ CL.consume`

タイプエラーが発生します:

`Reader/Couch.hs:24:47:
    Couldn't match expected type `Object' with actual type `Value'
    Expected type: Conduit Object m1 b0
      Actual type: Conduit Value m0 a0
    In the first argument of `(=$)', namely `toType'
    In the second argument of `($)', namely `toType =$ CL.consume'
Failed, modules loaded: none.

couchViewはSink Object m aパラメータとして必要なので、これは驚くべきことではありません。

問題は、getPages :: IO [Page]を実装する方法ですか?

4

1 に答える 1

0

私はconduit、aeson、またはcouchDBに精通していませんが、これは少なくともタイプチェックです。

getPages :: IO [Result Page]
getPages = runCouch (def { couchHost = "192.168.0.103" }) $ do
    couchView_ "reader" "reader" "pages" [] $ CL.map (fromJSON . Object) =$ CL.consume
于 2012-12-10T18:27:52.793 に答える