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。如果你按照我在答案中写的做,应该可以,如果我不清楚,对不起。