2016-01-26 2 views
0

Я пытаюсь написать пользовательскую регистрационную форму Yesod. Проблема, с которой я сталкиваюсь, заключается в том, что когда она попадает в fvInput, похоже, что вместо Apph используется приложение. Я не совсем уверен, как это должно быть обработано, и я не могу найти терминологию для этого. Я пробовал подниматься по-разному в форме, и я могу только заставить его бросать разные ошибки. Кроме того, единственный раз, когда эта ошибка возникает, - это если у меня есть строка fvInput, но если я удалю, то не будет выброшена ошибка и она будет правильно скомпилирована.Yesod fvInput не может соответствовать «App» с «Auth»

Код:

registrationForm :: Html -> MForm (HandlerT Auth (HandlerT App IO)) (FormResult UserForm, Widget) 
registrationForm extra = do 
    (emailRes, emailView) <- mreq textField "" Nothing 
    let userRes = UserForm <$> emailRes 
    let widget = do 
     [whamlet| 
      #{extra} 
      ^{fvInput emailView} 
      <input type=Submit value="Registration"> 
     |] 

    return (userRes, widget) 

Ошибка:

Foundation.hs:169:30: 
    Couldn't match type ‘App’ with ‘Auth’ 
    In the second argument of ‘(GHC.Base..)’, namely ‘toWidget’ 
    In the expression: asWidgetT GHC.Base.. toWidget 
    In a stmt of a 'do' block: 
     (asWidgetT GHC.Base.. toWidget) (fvInput emailView) 

Заранее спасибо за любую помощь!

  • Редактировать

Ошибка с лифтом до MREQ:

Foundation.hs:166:49: 
    Couldn't match type ‘HandlerT Auth (HandlerT App IO)’ 
       with ‘transformers-0.4.2.0:Control.Monad.Trans.RWS.Lazy.RWST 
         (Maybe (Env, FileEnv), HandlerSite m0, [Lang]) Enctype Ints m0’ 
    Expected type: HandlerT 
       Auth (HandlerT App IO) (FormResult Text, FieldView App) 
     Actual type: MForm m0 (FormResult Text, FieldView App) 
    In the second argument of ‘($)’, namely ‘mreq textField "" Nothing’ 
    In a stmt of a 'do' block: 
     (emailRes, emailView) <- lift $ mreq textField "" Nothing 

ответ

0

Ваш вернулся Widget тип на самом деле:

WidgetT App IO() 

Таким образом, существует несоответствие между Widget (который живет всего лишь App) и emailView (который живет в поднятой монаде HandlerT Auth (HandlerT App IO)).

Чтобы решить эту проблему:

  1. Изменить Вы печатаете подпись registrationForm :: Html -> MForm (HandlerT App IO) (FormResult UserForm, Widget)
  2. На месте использования, вам нужно применять lift скорее всего, но после того, как вы уже назвали соответствующий run функция для формы
+0

Я попытался это в какой-то момент. Я думал, что это неправильно, потому что это еще одна ошибка. Я обновил сообщение выше, чтобы получить другую ошибку с добавлением лифта. Спасибо за помощь! – Lethjakman

+0

Моя ошибка, лифт неправильный. Я обновлю ответ. –

+0

Вот и все. Спасибо! – Lethjakman