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

“当代码编译时,它在运行时失败。” 向此函数提供类型不太可能是错误。

“失败”是什么意思?

于 2011-11-03T04:01:01.780 回答
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 回答