使用RawSql更新时出现模糊类型错误

时间:2013-08-02 01:47:57

标签: haskell yesod persistent

我正在尝试基于其他列更新表的列,但看起来我无法使用updateWhere函数执行此操作。所以我尝试使用rawSQl但由于模糊的类型错误而无法正常工作。

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")

我收到以下错误,我确实尝试添加?更新后,但没有任何区别。

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的参数定义得很好,所以不确定是什么导致了这个问题。有人能告诉我如何解决上述问题吗?如果有更好的方法来更新基于其他列的列,也很想知道这一点。

谢谢!

1 个答案:

答案 0 :(得分:4)

我不太了解persistent,但是出现了类型错误,因为您正在以一种方式组合函数,即生成一个值而不进行检查。例如,如果您有函数f :: a -> (Int, c)g :: (Int, c) -> b,那么g . f感觉它应该具有a -> b类型,但它实际上是一个错误,因为GHC不知道是什么{ {1}}应该是。

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