4

私は最初のサイトで 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

4

2 に答える 2

4

実際のエラーを調査しないと、あなたのアプローチは良くないと思います。結局のところUTCTime、タイプは日付だけでなく時間を格納するために存在します。インスタンスを与えることで、ToMarkup UTCTimeこれをグローバルに修正します。

関数などを記述し、テンプレートで使用することをお勧めrenderAsDate :: UTCDate -> HTMLrenderAsTime :: UTCDate -> HTMLます#{renderAsDate (newsItemDate entry)}

しかし、これはランタイム エラーを解決しません。これはシリアライゼーション レイヤーから発生し、テンプレートとは無関係である可能性があります。

于 2012-09-05T07:18:55.777 に答える
1

集落でショーを使うことができると確信していますか?それは少なくとも私がやったことです...

#{show $ newsItemDate entry}

私は以前にこのインスタンスに遭遇したことがあり、この男がここで説明しているように、それは次のようなものです:

この表現の質素さの哲学の一部として、Haskellは型署名を必要としません—経験豊富なHaskellerが明確にするためにそれらを提供しますが—したがって、この強く型付けされた言語の型エラーは、初心者にとってしばしば不可解です。たとえば、2つの数値を加算する関数fを定義し、それを2つの文字列で呼び出す場合、コンパイラは不正な引数について文句を言いません。文字列が演算子plusをサポートしていないことについて文句を言います。そして、それは非常に非自明な方法でこの苦情を定式化します。[1]「1.HaskellisTerse」の下で..。

[1] http://fpcomplete.com/ten-things-you-should-know-about-haskell-syntax/

于 2012-11-15T22:08:59.107 に答える