首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RawSql更新时的模糊类型错误

使用RawSql更新时的模糊类型错误
EN

Stack Overflow用户
提问于 2013-08-02 01:47:57
回答 1查看 151关注 0票数 1

我试图根据其他列更新表的一个列,但似乎无法使用updateWhere函数进行更新。因此,我尝试使用rawSQl,但由于类型错误,它无法工作。

代码语言:javascript
复制
getCalculateDeltaR :: personId -> Handler Html
getCalculateDeltaR personId = do

    goods <- runDB $ selectList [GoodPerson ==. personId] [] 

    forM goods $ \(Entity gid good) -> do
         let aid = goodAsset good  
         asset <- runDB $ get404 aid
         let mktValue = assetMktValue asset
         runDB $ rawSql "UPDATE good SET  delta = (? - orig_value) \
              WHERE person = ? AND asset = ?" 
              [toPersistValue mktValue, toPersistValue personId, toPersistValue aid]

    defaultLayout $ do
        $(widgetFile "calculateDelta")

我得到了以下错误,并尝试添加?在更新之后,但没有产生任何影响。

代码语言:javascript
复制
Ambiguous type variable `a0' in the constraint:
  (RawSql a0) arising from a use of `rawSql'
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `($)', namely
  `rawSql
 ...
 ...

我可以传递给rawSQL的参数定义得很好,所以不确定是什么导致了这个问题。有人能告诉我如何解决上述问题吗?如果有更好的方法来更新基于其他列的列,那么也想知道这一点。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-02 02:07:53

我不太了解persistent,但这种类型错误的发生是因为您组合函数的方式是在不被检查的情况下生成一个消耗的值。例如,如果您有函数f :: a -> (Int, c)g :: (Int, c) -> b,那么g . f觉得它应该具有a -> b类型,但实际上这是一个错误,因为GHC不知道c应该是什么。

解决这个问题的方法是检查(Int, c)值,这样就可以将c解析成特定的类型。这通常是通过手动类型注释或使用asTypeOf来完成的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18007484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档