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

How to specify type for class constrained value?

我正在尝试对以下 persistent 调用的结果使用类型签名。我不知道如何为参数化和 class 约束的东西定义签名,例如下面转换器内部的 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]

如何使用后一种方法? 2. 在没有扩展的情况下完全可以解决吗?我会将该签名更改为什么?

在类型签名中添加一个forall

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

使用 ScopedTypeVariables 时,变量仅在使用 forall 显式引入时才限定范围。

原来我没有意识到您也需要在函数内部重复约束。这有效:

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