проверить поле из базы данных Yesod

Привет, я хочу создать файл, который принимает только значения, которые существуют в таблице (с более чем 20000 строк), поэтому у меня есть следующий код

demoForm :: Maybe Demo -> AForm Handler Demo
demoForm   demo = Demo 
                <$> areq nitField (bfs (MsgName)) (demoFieldOne <$> demo)
                <*> areq intField (bfs (MsgName)) (demoFieldTwo <$> demo)

           where 
             errorMessage :: Text
             errorMessage = "the company no exist!"                 

             nitField = check validateNit textField

             validateNit nit
                | companiesMatch nit  = Left errorMessage
                | otherwise = Right nit

             companiesMatch name = do
                  entities <- runDB $ selectList [CompanyName ==. name] []
                  return (null entities)

но я получаю сообщение об ошибке Couldn't match expected type ‘Bool’with actual type ‘m0 (HandlerT site0 IO Bool)’, так как же получить логическое значение из монады или существует лучший способ выполнить эту проверку?


person oriaj    schedule 21.10.2016    source источник
comment
Я думаю, вы хотите вместо этого использовать функцию checkM.   -  person Michael Snoyman    schedule 23.10.2016


Ответы (1)


спасибо @Michael Snoyman, ты прав, мне просто нужно использовать checkM

demoForm :: Maybe Demo -> AForm Handler Demo
demoForm   demo = Demo 
                <$> areq nitField (bfs (MsgName)) (demoFieldOne <$> demo)
                <*> areq intField (bfs (MsgName)) (demoFieldTwo <$> demo)
           where 
            nitField = checkM validateNit textField
            validateNit input = do
              mbNit <- runDB $ selectList [CompanyName ==. input] []
              return $ case null mbNit of
                True  -> Left (MsgErrNit :: AppMessage)
                False -> Right input          
person oriaj    schedule 24.10.2016