Может ли кто-нибудь объяснить мне, как я должен исправить эту подпись? - PullRequest
1 голос
/ 03 ноября 2011

Вот код, я пытался позволить выводу типа определить тип функции.Во время компиляции кода происходит сбой во время выполнения.

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)

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

ghci говорит вам, что не знает, какие выражения типов выбрать для b и m. Все, что вам нужно сделать, это сказать,

isFree testDay :: Foo Bar Bool

В реальных программах эти переменные типа обычно определяются на сайте использования, поэтому вам редко приходится указывать тип выражения там. В приглашении ghci контекст отсутствует, поэтому вам часто приходится это делать.

Не имеет значения, последняя строка isFree будет лучше return $ L.null match

1 голос
/ 03 ноября 2011

Это смущает. С одной стороны, эта проблема заставила меня углубиться в глубины монад Йесод. С другой стороны, на этот вопрос мне уже ответили. Когда вы запускаете действие базы данных, передайте результат в 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)
1 голос
/ 03 ноября 2011

"Во время компиляции кода происходит сбой во время выполнения." очень маловероятно, будет ошибкой при вводе типа для этой функции.

Что значит "потерпеть неудачу"?

...