HaskellとYesodの初心者はここにいます。私は、Yesodの本(http://www.yesodweb.com/book/persistent)の永続的な章のYesodとの統合の例に従おうとしています。Sqliteはコンパイルされ、正常に実行されるようです。しかし、私はMongDBを使おうとしていて、物事を機能させるのに苦労しています。具体的には:
sqliteの例では:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Yesodの本には、「Mongoコードが
mongoSettings
代わりに使用されます」と書かれています。しかし、どのモジュールでもそれを見つけることができず、コードはコンパイルされません。代わりに、代わりにこれを使用する必要がありましたmongoSettings
:MkPersistSettings { mpsBackend = ConT ''Action }
コンパイルするにはLanguage.Haskell.TH.Syntaxをインポートする必要がありましたが、これはユーザーから非表示にする必要があると想定しているため、正しく実行されていません。
また、Mongoの永続テストでは、「共有」と「移行」の部分がないことがわかりました。理由はよくわかりませんが、MongoDBはスキーマがなく、移行の必要がないためだと思いますか?
SqlPersist
SqlPersistに相当すると思いましたが、ほぼそうだと思います。Persistentのテストディレクトリのinit.hsで
MongoPersist
1つのインスタンスを見つけました。MongoPersist
でもコメントアウトされているので、時代遅れな気がしますか?そうでなければ、私が知る限り、それはとにかく定義されていません。したがって、次の行(YesodブックのP.115、またはhttp://www.yesodweb.com/book/persistentの終わり近く)をMongoDBで機能するように変換する方法がわかりません。instance YesodPersist PersistTest where type YesodPersistBackend PersistTest = SqlPersist runDB action = do PersistTest pool <- getYesod runSqlPool action pool
withMongoDBConnの使用
したがって、sqliteの場合、コードは次のようになります(上記のWebページの最初の例):
main :: IO () main = withSqliteConn ":memory:" $ runSqlConn $ do runMigration migrateAll johnId <- insert $ Person "John Doe" $ Just 35 ... and so on
だが
main :: IO() main = withMongoDBConn ":memory:" $ runMongoDBConn $ do runMigration migrateAll johnId <- insert $ Person "John Doe" $ Just 35 ... and so on
動作しません。まず、runMigration
何らかの理由で範囲外です。さて、MongoDBの移行は必要ないかもしれないので、その行を削除します。次に、コンパイラは次のように文句を言います:
Couldn't match expected type
AccessMode'と実際のタイプm0 b0'
Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode
Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0
など。そしてこの段階までに、モナドについての私の非常に大雑把な知識は、これを理解するのに十分ではありません。
全体として、私はYesodとの統合の例を本からSqliteからMongoDBに変換するのに非常に苦労しています。誰かが私にYesod/Persistent with MongoDBの具体例を教えてもらえますか?よろしくお願いします。