我遇到了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
错误主要是抱怨insertItem
和changeItemStatus
,这两者都是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})
withAccount
和withItem
是辅助函数,可帮助我处理数据库中的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 Response
将insertItem
和changeItemStatus
的类型签名放在一起,但每次尝试都给了我我认为更糟糕的错误而是:t
。
我还不是一个特别熟练的Haskeller,所以我觉得我唯一可以尝试的是在这个地方洒下随机No instance for (MonadIO m1)
s,但这听起来并不是很有可能实际上解决问题,或教我什么。
我试图实现的一般概念是:“对数据库进行此更改,然后返回当前用户的相关元素的(可能已更改的)列表”。
关于我接下来应该尝试什么,或者我哪里出错的提示?我是以完全错误的方式思考这个问题的吗?是否有其他文件可以咨询这个问题?
PS。我已经包含了我认为上面所有相关代码的内容,但如果您想查看完整的来源,那就是here和here。
编辑:完整类型错误
return $