我不清楚為什么型別宣告無法編譯并且我無法解釋編譯器錯誤,我錯過了什么?下面是帶有型別定義和編譯器錯誤的代碼。
{-# LANGUAGE RankNTypes, FlexibleContexts #-}
module API.Models.RunDB where
import Control.Monad.IO.Class (MonadIO, liftIO)
import Database.Persist.Sql (ConnectionPool, runSqlPool, SqlPersistT)
import Web.Scotty (ActionM)
type RunDB = MonadIO m => (forall a. SqlPersistT IO a -> m a)
runDB' :: ConnectionPool -> RunDB
runDB' pool q = liftIO $ runSqlPool q pool
RunDB.hs:8:22: error:
Not in scope: type variable ‘m’
|
8 | type RunDB = MonadIO m => (forall a. SqlPersistT IO a -> m a)
| ^
uj5u.com熱心網友回復:
在型別同義詞的右側,您不能像在大多數其他地方那樣,憑空組合型別變數名稱。您需要通過指定來明確量化它forall m,如下所示:
type RunDB = forall m. MonadIO m => (forall a. SqlPersistT IO a -> m a)
還有兩種替代解決方案。一種是m作為引數傳遞給型別同義詞,然后更改runDB'的型別以回傳 a RunDB m:
type RunDB m = MonadIO m => (forall a. SqlPersistT IO a -> m a)
runDB' :: ConnectionPool -> RunDB m
另一種方法是去掉型別同義詞并寫成:
runDB' :: MonadIO m => ConnectionPool -> SqlPersistT IO a -> m a
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316863.html
