Haskell 有人能给我解释一下我该如何着手修复这个类型签名吗?

Haskell 有人能给我解释一下我该如何着手修复这个类型签名吗?,haskell,types,persistent,yesod,Haskell,Types,Persistent,Yesod,这是代码,我试着让类型推断出函数的类型。代码编译时,会在运行时失败 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

这是代码,我试着让类型推断出函数的类型。代码编译时,会在运行时失败

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::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)
>isFree day=do

matchghci告诉您它不知道为
b
m
选择哪种类型的表达式。你所要做的就是说出来

isFree testDay :: Foo Bar Bool
在实际程序中,这些类型变量通常在使用站点确定,因此您很少需要在那里指定表达式的类型。在ghci提示下,上下文丢失,因此您通常必须这样做


与此无关,isFree的最后一行最好是
return$L.null match

ghci告诉您它不知道为
b
m
选择哪种类型的表达式。你所要做的就是说出来

isFree testDay :: Foo Bar Bool
在实际程序中,这些类型变量通常在使用站点确定,因此您很少需要在那里指定表达式的类型。在ghci提示下,上下文丢失,因此您通常必须这样做

与此无关,isFree的最后一行最好是
返回$L.null match

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

“fail”是什么意思?

“代码编译时会在运行时失败。”为该函数提供类型时不太可能出现错误


“失败”是什么意思?

这很尴尬。一方面,这个问题确实让我深入研究了单子。另一方面,这个问题已经为我解答了。运行数据库操作时,将结果像这样传递给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)
>isFree day=do

match这太尴尬了。一方面,这个问题确实让我深入研究了单子。另一方面,这个问题已经为我解答了。运行数据库操作时,将结果像这样传递给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)
>isFree day=do

match
liftIO(return x)
可能只是
return x
。不确定
MonadIO
MonadTrans
实例是否有任何“定律”,但如果有,肯定会有一个。=)不知道什么是Foo和Bar。当然,谢谢。引用我最喜欢的签名:“如果我没有看到更多,那就是站在巨人的脚印上。”@MichaelLitchard:不管你想要什么,只要有一个
实例,Foo Bar
liftIO(return x)
很可能就是
return x
。不确定
MonadIO
MonadTrans
实例是否有任何“定律”,但如果有,肯定会有一个。=)不知道什么是Foo和Bar。当然,谢谢。引用我最喜欢的签名:“如果我没有看到更多,那就是站在巨人的脚印上。”@MichaelLitchard:不管你想要什么,只要有一个
Foo Bar