sqlite - Haskell 变量 "not in scope: type variable ' m'"

标签 sqlite haskell

我不清楚为什么类型声明无法编译并且我无法解释编译器错误,我错过了什么?下面是带有类型定义和编译器错误的代码。

{-# 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)
  |                      ^

最佳答案

在类型同义词的右侧,您不能像在大多数其他地方那样突然组成类型变量名。您需要通过指定 forall m 来显式量化它,如下所示:

type RunDB = forall m. MonadIO m => (forall a. SqlPersistT IO a -> m a)

还有两种替代解决方案。一种方法是将 m 作为参数传递给类型同义词,然后更改 runDB' 的类型以返回 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

关于sqlite - Haskell 变量 "not in scope: type variable ' m'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69431119/

相关文章:

android - 在事务运行时读取 sqlite 数据 (Android)

android - 语法错误,无法将电子邮件键入 SQLite

sql - 如何在一条语句中查询三个表的sql?

c# - 设置 NHibernate Fluent 以进行级联操作。

haskell - 使用列表理解查找列表中的单个元素

haskell - 在二叉树haskell中搜索一个值

Haskell:有效模拟内存块的纯数据结构?

android - select 中的 Ormlite 子查询

Haskell 无法从上下文错误中推断出 ...

exception - Haskell (ghc) Control.Exception 中,try 和 catch 的区别