我在我的第一个网站上使用Yesod,我有一个新闻列表:
NewsItem
date UTCTime default=CURRENT_TIME
title String
content String
author String
在我的处理程序中检索:
newsitems <- runDB $ selectList [] [Desc NewsItemDate]
并最终在我的模板中使用:
$if null newsitems
<p>No news.
$else
$forall Entity id entry <- newsitems
<article>
<h4>#{newsItemDate entry}
<p>#{newsItemContent entry}
但是我收到有关数据类型的错误:
Handler/Home.hs:20:11:
No instance for (Text.Blaze.ToMarkup
time-1.4:Data.Time.Clock.UTC.UTCTime)
arising from a use of `toHtml'
Possible fix:
add an instance declaration for
(Text.Blaze.ToMarkup time-1.4:Data.Time.Clock.UTC.UTCTime)
In the first argument of `toWidget', namely
`toHtml (newsItemDate entry_a6ev)'
In a stmt of a 'do' block:
toWidget (toHtml (newsItemDate entry_a6ev))
In the expression:
do { toWidget
((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
"<article><h4>");
toWidget (toHtml (newsItemDate entry_a6ev));
toWidget
((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
"</h4>\
\<p>");
toWidget (toHtml (newsItemContent entry_a6ev));
.... }
所以我想我会继续添加到我的Import.hs:
import Data.Time (UTCTime)
import Data.Time.Format (formatTime)
import Text.Blaze (ToMarkup, toMarkup)
import Text.Blaze.Internal (string)
import System.Locale (defaultTimeLocale)
-- format date as 26 July 2012
instance ToMarkup UTCTime where
toMarkup a = string (formatTime defaultTimeLocale "%e %B %Y" a)
哪个编译,但在运行时在浏览器中给我一个错误:
Internal Server Error
PersistMarshalError "Expected UTCTime, received PersistText \"2012-08-30\""
所以我不知道如何解决这个问题,任何想法?
编辑:网站的源代码,以防需要或好奇:https://github.com/iaefai/socrsite
答案 0 :(得分:4)
在不调查实际错误的情况下,我认为您的方法并不好。你很可能最终想要几种格式化UTCTime
的方法,毕竟,类型是存储时间,而不仅仅是日期。通过提供ToMarkup UTCTime
实例,您可以全局修复此问题。
我建议您编写函数renderAsDate :: UTCDate -> HTML
,renderAsTime :: UTCDate -> HTML
等,并在模板中使用它们,例如#{renderAsDate (newsItemDate entry)}
。
但这不会解决运行时错误,它来自序列化层,可能与您的模板无关。
答案 1 :(得分:1)
我很确定你可以在小村庄里使用show吗?这至少是我做过的......
#{show $ newsItemDate entry}
之前我遇到过这个实例,正如这个人在这里描述的那样:
作为表达节俭哲学的一部分,Haskell没有 需要类型签名 - 尽管经验丰富的Haskeller提供 它们是为了清晰起见 - 所以这种强类型语言的类型错误是 对于没有经验的人来说,往往是神秘的。例如,如果你定义一个 函数f,它添加两个数字,然后用两个字符串调用它, 编译器不会抱怨错误的论点,它会抱怨 关于字符串不支持运算符加。它将制定这一点 以非常明显的方式投诉。 [1]在“1. Haskell是Terse”下......
[1] http://fpcomplete.com/ten-things-you-should-know-about-haskell-syntax/