如何为 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]
我正在尝试对以下 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]