servant
とライブラリの両方を使用しpersistent
て REST API をinsertUnique
作成すると、新しいエンティティを作成するために使用するタイプの不一致エラーが発生します。
問題のある機能は次のとおりです。
createUser :: Entity User -> App Int64
createUser p = do
maybeNewUser <- runDb (insertUnique (User (userUsername $ entityVal p) (userSpotifyUser $ entityVal p)))
case maybeNewUser of
Nothing -> throwError err400
Just newUser -> return $ fromSqlKey newUser
次のエラーが発生します。
Couldn't match expected type ‘persistent-2.2.4.1:Database.Persist.Sql.Types.SqlBackend’
with actual type ‘persistent-2.2.4.1:Database.Persist.Class.PersistEntity.PersistEntityBackend
(String
-> String
-> time-1.5.0.1:Data.Time.Clock.UTC.UTCTime
-> time-1.5.0.1:Data.Time.Clock.UTC.UTCTime
-> User)’
In the first argument of ‘runDb’, namely
[snip]
参考までに、runDb
関数:
runDb :: (MonadReader Config m, MonadIO m) => SqlPersistT IO b -> m b
runDb query = do
pool <- asks getPool
liftIO $ runSqlPool query pool
そしてApp
ニュータイプ:
newtype App a = App
{ runApp :: ReaderT Config (ExceptT ServantErr IO) a } deriving
(Functor, Applicative, Monad, MonadReader Config, MonadError ServantErr, MonadIO)
insertUnique
asの結果をタイプヒントしようとしましSqlBackend
たが、同様に紛らわしいエラーが発生します。SqlBackend
とPersistentEntityBackend
タイプは互換性がありませんか?
それとも、モナドの形式が間違っているのでしょうか?
どんな援助も大歓迎です。