AcidState函数中的不明确类型变量

时间:2013-02-06 04:42:54

标签: haskell typeerror acid-state

我遇到了Haskell网络项目的情况,我收到错误Ambiguous type variable

相关代码是

--- Other import statements
import qualified Model as Model

---------- HTTP Handlers
needItem db user itemName = do
  Model.changeItemStatus db user itemName Model.Need
  listItems db user

gotItem db user itemName = do
  Model.changeItemStatus db user itemName Model.Got
  listItems db user

newItem db user itemName comment count = do
  Model.insertItem db user itemName comment count
  listItems db user

listItems db user = do
  lst <- Model.listItems db user
  resOk lst

--- rest of the program

错误主要是抱怨insertItemchangeItemStatus,这两者都是acid-state查询函数

insertItem db name itemName comment count = withAccount db name newItem
  where item = Item { itemName = itemName, itemComment = comment, itemCount = count, itemStatus = Need } 
        newItem account = update' db $ NewItem account item

-- other stuff

changeItemStatus db name itemName status = withAccount db name cItem
  where cItem account = withItem account itemName
                        (\i -> update' db $ ChangeItem account $ i { itemStatus = status})

withAccountwithItem是辅助函数,可帮助我处理数据库中的Maybe返回值。它们被定义为

withAccount :: MonadIO m => AcidState GoGetDB -> String -> (Account -> a) -> m (Maybe a)
withAccount db name fn = do
  maybeAccount <- query' db $ AccountByName name
  return $ do acct <- maybeAccount
              return $ fn acct

withItem :: Account -> String -> (Item -> a) -> Maybe a
withItem account itemName fn = do
  item <- getOne $ (accountItems account) @= itemName
  return $ fn item

好的,现在呢。

我已多次阅读the AcidState documentation in the Happstack crash-course,但这并没有多大帮助;他们直接在响应生成函数中使用查询

  • 我已经尝试了同样的Ambiguous type variable错误,除了指向query'调用iteslf,
  • 我真的不想这样做,因为这会迫使我混合我的模型/控制器代码
  • 对我的特定情况没有帮助,因为它没有告诉我调用query'update'的函数的具体返回类型是什么(它们的函数都是{{1}因为他们直接生成响应)。

我试图通过在表达式的各个部分上使用AcidState DBName -> ServerPart ResponseinsertItemchangeItemStatus的类型签名放在一起,但每次尝试都给了我我认为更糟糕的错误而是:t

我还不是一个特别熟练的Haskeller,所以我觉得我唯一可以尝试的是在这个地方洒下随机No instance for (MonadIO m1) s,但这听起来并不是很有可能实际上解决问题,或教我什么。

我试图实现的一般概念是:“对数据库进行此更改,然后返回当前用户的相关元素的(可能已更改的)列表”。

关于我接下来应该尝试什么,或者我哪里出错的提示?我是以完全错误的方式思考这个问题的吗?是否有其他文件可以咨询这个问题?

PS。我已经包含了我认为上面所有相关代码的内容,但如果您想查看完整的来源,那就是herehere

编辑:完整类型错误

return $

0 个答案:

没有答案