1

我正在尝试根据其他列更新表的列,但看起来我无法使用 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 的参数定义明确,所以不确定是什么导致了这个问题。有人可以告诉我应该如何解决上述问题吗?如果有更好的方法来更新基于其他列的列,我也很想知道这一点。

谢谢!

4

1 回答 1

4

我不太清楚persistent,但是会发生这种类型错误,因为您正在以这样一种方式组合函数,即在不检查的情况下产生一个值并消耗掉一个值。例如,如果你有函数f :: a -> (Int, c)g :: (Int, c) -> b然后g . f感觉它应该有 type a -> b,但这实际上是一个错误,因为 GHC 不知道c应该是什么。

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

于 2013-08-02T02:07:53.727 回答