1

コードは次のとおりです。型推論に関数の型を割り出させてみました。コードはコンパイルされますが、実行時に失敗します。

Ambiguous type variables `b0', `m0' in the constraint:
  (PersistBackend b0 m0) arising from a use of `isFree'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: isFree testDay
In an equation for `it': it = isFree testDay

:t isFree

isFree :: PersistBackend b m => C.Day -> b m Bool

>isFree day = do
   match <- selectList [TestStartDate ==. day,
                        TestStatus !=. Passed,
                        TestStatus !=. Failed] []
   if (L.null match) then (liftIO $ return True) else (liftIO $ return False)
4

3 に答える 3

5

ghci は、bandに対してどの型式を選択すればよいかわからないことを伝えていますm。あなたがしなければならないことは、それを伝えることだけです。

isFree testDay :: Foo Bar Bool

実際のプログラムでは、これらの型変数は通常、使用場所で決定されるため、そこで式の型を指定する必要はほとんどありません。ghci プロンプトでは、コンテキストが欠落しているため、頻繁に実行する必要があります。

関係ありませんが、isFree の最後の行はreturn $ L.null match

于 2011-11-03T01:12:52.357 に答える
1

これは恥ずかしいです。一方で、この問題により、Yesod モナドの深みを掘り下げることができました。一方、この質問はすでに私にとって答えられていました。データベース アクションを実行すると、その結果が runDB に渡されます。

>isFree day = do
   match <- runDB $ selectList [TestStartDate ==. day,
                                TestStatus !=. Passed,
                                TestStatus !=. Failed] []
   if (L.null match) then (liftIO $ return True) else (liftIO $ return False)
于 2011-11-03T04:01:35.343 に答える
1

「コードのコンパイル中、実行時に失敗します。」この関数に型を指定する際にエラーになる可能性はほとんどありません。

「失敗」とは?

于 2011-11-03T04:01:01.780 に答える