エラーが発生する Haskell Web プロジェクトで状況が発生しました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
よし、じゃあ。
Happstack クラッシュ コースの AcidState ドキュメントを何度か読みましたが、あまり役に立ちませんでした。彼らは、応答生成関数で直接クエリを使用します。
- 試してみましたが、iteslf
Ambiguous type variable
の呼び出しを指していることを除いて、同じエラーが発生しました。query'
- モデル/コントローラーコードと
query'
呼び出す関数の具体的な戻り値の型が表示されないため、特定の状況には役立ちません(応答を直接生成するため、update'
それらの関数は allです)。AcidState DBName -> ServerPart Response
insertItem
私は、式の一部を forとchangeItemStatus
by usingの型シグネチャをまとめようとしました:t
が、すべての試みで、No instance for (MonadIO m1)
代わりに悪いエラーであると私が想定しているものを与えてくれました。
私はまだ特に熟達した Haskeller ではないので、他に試してみることができる唯一の方法は、ランダムなreturn $
s をその場所にまき散らすことだと思いますが、それでは実際に問題を修正したり、教えたりする可能性が高いとは思えません。私は何でも。
私が実装しようとしている一般的な概念は、「この変更をDBに加えてから、現在のユーザーに関連する要素の(潜在的に変更された)リストを返す」です。
次に何を試すべきか、または具体的にどこが間違っているかについてのヒントはありますか? 私はこれについて完全に間違った方法で考えていますか? この件に関して私が参照できる他のドキュメントはありますか?
PS。上記のすべての関連コードと思われるものを含めましたが、完全なソースを見たい場合は、こことここにあります。
編集: 完全なタイプのエラー
/home/inaimathi/projects/goget/goget.hs:31:3:
Ambiguous type variable `m2' in the constraint:
(Control.Monad.IO.Class.MonadIO m2)
arising from a use of `Model.changeItemStatus'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' block:
Model.changeItemStatus db user itemName Model.Need
In the expression:
do { Model.changeItemStatus db user itemName Model.Need;
listItems db user }
In an equation for `needItem':
needItem db user itemName
= do { Model.changeItemStatus db user itemName Model.Need;
listItems db user }
/home/inaimathi/projects/goget/goget.hs:35:3:
Ambiguous type variable `m1' in the constraint:
(Control.Monad.IO.Class.MonadIO m1)
arising from a use of `Model.changeItemStatus'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' block:
Model.changeItemStatus db user itemName Model.Got
In the expression:
do { Model.changeItemStatus db user itemName Model.Got;
listItems db user }
In an equation for `gotItem':
gotItem db user itemName
= do { Model.changeItemStatus db user itemName Model.Got;
listItems db user }
/home/inaimathi/projects/goget/goget.hs:39:3:
Ambiguous type variable `m0' in the constraint:
(Control.Monad.IO.Class.MonadIO m0)
arising from a use of `Model.insertItem'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' block:
Model.insertItem db user itemName comment count
In the expression:
do { Model.insertItem db user itemName comment count;
listItems db user }
In an equation for `newItem':
newItem db user itemName comment count
= do { Model.insertItem db user itemName comment count;
listItems db user }