Haskell 如何为类约束值指定类型?

Haskell 如何为类约束值指定类型?,haskell,yesod,typeclass,persistent,monad-transformers,Haskell,Yesod,Typeclass,Persistent,Monad Transformers,我正在尝试对以下持久调用的结果使用类型签名。我不知道如何为参数化和类约束的对象定义签名,例如下面的转换器内部的m: saveMyStuff :: MonadIO m => Int -> SqlPersistT m Stuff saveMyStuff somethingId = do -- 1. this works with ScopedTypeVariables (_ :: [Entity MyEntity]) <- rawSql "SELECT ?? FROM my

我正在尝试对以下
持久调用的结果使用类型签名。我不知道如何为参数化和类约束的对象定义签名,例如下面的转换器内部的
m

saveMyStuff :: MonadIO m => Int -> SqlPersistT m Stuff
saveMyStuff somethingId = do
  -- 1. this works with ScopedTypeVariables
  (_ :: [Entity MyEntity]) <- rawSql "SELECT ?? FROM my_entities WHERE id = ? FOR UPDATE" 
                                     [toPersistValue somethingId]
  -- 2. this doesn't :(
  _ <- rawSql "SELECT ?? FROM my_entities WHERE id = ? FOR UPDATE" 
              [toPersistValue somethingId]
              :: SqlPersistT m [Entity MyEntity]
saveMyStuff::MonadIO m=>Int->sqlpersist m Stuff
saveMyStuff somethingId=do
-- 1. 这适用于ScopedTypeVariables

(:[Entity MyEntity])在类型签名中添加一个
forall

saveMyStuff :: forall m. MonadIO m => Int -> SqlPersistT m Stuff

使用时,仅当变量通过
forall
显式引入时,才确定变量的作用域

结果是,我没有意识到您也需要在函数内部重复约束。这起到了作用:

_ <- rawSql "SELECT ?? FROM my_entities WHERE id = ? FOR UPDATE" 
          [toPersistValue somethingId]
          :: MonadIO m => SqlPersistT m [Entity MyEntity]
\uSQLPersistt m[实体MyEntity]

我实际上在想如何制作2。从我不使用ScopedTypeVariables的示例工作中,如果问题不是非常清楚,很抱歉。@AlexandrKurilin 2。如果你按照我在答案中写的做,应该可以,如果我不清楚,对不起。