2013-08-02 4 views
1

Я пытаюсь обновить столбец таблицы на основе других столбцов, но похоже, что я не могу сделать это с помощью функции updateWhere. Поэтому я попытался использовать rawSQl, но он не работает из-за неоднозначной ошибки типа.Ошибка неоднозначного типа при использовании RawSql Update

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

Я получаю следующее сообщение об ошибке, и я попробовал добавить ?? после UPDATE, но это не изменило ситуацию.

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

Я не знаю persistent Хорошо, но ошибка этого типа возникает из-за того, что вы комбинируете функции таким образом, чтобы значение получалось потребляемым без проверки. Например, если у вас есть функции f :: a -> (Int, c) и g :: (Int, c) -> b, то g . f чувствует, что он должен иметь тип a -> b, но на самом деле это ошибка, потому что GHC не знает, что должно было быть c.

Способ решения этой проблемы заключается в том, чтобы проверить, что (Int, c) значение таким образом, что c может быть разрешено для определенного типа. Это часто делается с аннотациями вручную или с использованием asTypeOf.

+1

это потрясающе! Спасибо за предложение. Добавив :: Handler [Entity Good] в конец моего оператора rawSql, исправлена ​​ошибка. Я не знаю, что UPDATE будет точно возвращать, но похоже, что тип таблицы удовлетворяет компилятору, так как меня не волнуют какие-либо возвращаемые значения. – Ecognium

Смежные вопросы