2015-08-07 2 views
2

Я пытаюсь использовать Yesod для создания простого веб-сайта, и я начинаю с код от превосходного вступления Max Tagher на Youtube, YesodScreencast. Я разветвил его код от GitHub, и я хотел бы добавить дату публикации, чтобы указать, когда она была опубликована, но я столкнулся с проблемой, которую я не могу понять, учитывая мой низкий опыт работы с Haskell и опыт новичка с Йесодом. Я не смог найти ответ через Googleplex.Не удалось вывести (blaze-markup-0.6.3.0: Text.Blaze.ToMarkup Day), возникающий из-за использования 'toHtml'

Йесод обеспечивает в Yesod.Form.Fields родной dayField, так что я подумал, что все, что мне нужно было сделать, чтобы добавить postdate Field в BlogPost следующее конфигурационными/моделей с использованием Day:

BlogPost 
    title Text 
    postdate Day 
    article Markdown 

и добавить его к blogPostForm в PostNew.hs:

blogPostForm :: AForm Handler BlogPost 
blogPostForm = BlogPost 
      <$> areq textField  (bfs ("Title" :: Text)) Nothing 
      <*> areq dayField  (bfs ("Postdate" :: Day)) Nothing 
      <*> areq markdownField (bfs ("Article" :: Text)) Nothing 

Когда компилирует я получаю следующее сообщение об ошибке:

Handler/Home.hs:16:11: 
    Could not deduce (blaze-markup-0.6.3.0:Text.Blaze.ToMarkup Day) 
     arising from a use of ‘toHtml’ 
    from the context (PersistEntity BlogPost) 
     bound by a pattern with constructor 
       Entity :: forall record. 
          PersistEntity record => 
          Key record -> record -> Entity record, 
       in a lambda abstraction 
     at Handler/Home.hs:16:11-34 
    In the first argument of ‘asWidgetT GHC.Base.. toWidget’, namely 
     ‘toHtml (blogPostPostdate post_apZp)’ 
    In a stmt of a 'do' block: 
     (asWidgetT GHC.Base.. toWidget) 
     (toHtml (blogPostPostdate post_apZp)) 
    In the expression: 
     do { (asWidgetT GHC.Base.. toWidget) 
      ((blaze-markup-0.6.3.0:Text.Blaze.Internal.preEscapedText 
       GHC.Base.. Data.Text.pack) 
       "<h4><li><a href=\""); 
      (getUrlRenderParams 
      >>= 
       (\ urender_apZq 
       -> (asWidgetT GHC.Base.. toWidget) 
         (toHtml 
         (\ u_apZr -> urender_apZq u_apZr [] (PostDetailsR id_apZo))))); 
      (asWidgetT GHC.Base.. toWidget) 
      ((blaze-markup-0.6.3.0:Text.Blaze.Internal.preEscapedText 
       GHC.Base.. Data.Text.pack) 
       "\">"); 
      (asWidgetT GHC.Base.. toWidget) 
      (toHtml (blogPostPostdate post_apZp)); 
      .... } 

Если я изменю Day на Text, все будет работать так, как я ожидаю. Я не уверен, почему Есод не может иметь дело с Day, так как он имеет dayField в Yesod.Form.Fields, который я ожидал бы с этим справиться. Я считаю, что это что-то простое, но я не могу определить, что мне нужно сделать, чтобы исправить эту ошибку.

ответ

1

Похоже, что для Date данных нет экземпляра для ToMarkup.

Вы могли бы поставить Экземпляр себя:

instance ToMarkup Date where 
    toMarkup = toMarkup . show 

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

 Смежные вопросы

  • Нет связанных вопросов^_^