0

Spock、persistent、blaze-html を使用して Haskell Web 開発を始めたばかりです。

私が持っているルートの 1 つで、選択したテーブルのすべての行をロードしたいと考えています。私はこのようなことをします:

  get ("/show/flight/" <//> (var :: Var Integer)) $ \f -> requireUser $ \(_, l) -> do
     fs <- runSQL $ loadFlightInfos f

     case fs of
        [] -> blaze $ template False (showResultAlertBar False "Oops, something went wrong! Please try again.")
        _  -> blaze $ template True (H.toHtml $ usersUsername l) loadFlightSeat

           where
              loadFlightSeat :: H.Html
              loadFlightSeat =
                 forM_ fs $ \fs' -> do
                    sid <- runSQL $ getSeatIdByFlight fs' c

                    case sid of
                       Nothing  -> H.div H.! A.class_ "alert alert-danger" $ "Oops, something went wrong! Please try again."
                       Just rid -> H.a H.! A.href (H.toValue $ "/flight/seat/" <> show c <> "/" <> show (fromIntegral $ (fromSqlKey . entityKey) sid)) H.! A.class_ "btn btn-theme" $ H.toHtml fs'

loadFlightInfosタイプがあります:

Integer -> SqlPersistM [Entity Flight]

getSeatIdByFlight:

T.Text -> Integer -> SqlPersistM (Maybe (Entity Flight))

runSQLSpock のブログ サンプル アプリからコピーしたもので、次のようなものです。

runSQL :: (HasSpock m, SpockConn m ~ SqlBackend) => SqlPersistT (NoLoggingT (ResourceT IO)) a -> m a
runSQL action = runQuery $ \conn -> runResourceT $ runNoLoggingT $ runSqlConn action conn

私が得た型エラー:

Couldn't match expected type ‘SqlBackend’
        with actual type ‘SpockConn Text.Blaze.Internal.MarkupM’
In the expression: runSQL
In a stmt of a 'do' block:
   sid <- runSQL $ getSeatIdByFlight fs' c

私はまだこの型エラーを理解していません.PersistentからSpockへのラッパーであることを知っているので、runSQL単にHTMLを出力したいだけなら、なぜ型チェックに合格できないのですか?

このタイプのエラーを解決するにはどうすればよいですか?

4

1 に答える 1

1

免責事項: 私はあなたのコードを実行しませんでした。

runSQLパーシスタントからスポックへのラッパーであることは知っています

まさに、あなたの問題があります。のタイプrunSQLは次のとおりです。

runSQL :: (HasSpock m, SpockConn m ~ SqlBackend)
       => SqlPersistT (NoLoggingT (ResourceT IO)) a -> m a

結果の型は、結果が Spock モナドで返される(HasSpock m, SpockConn m ~ SqlBackend) => m aことを示しています。runSQLしたがって、loadFlightSeatSpock モナド計算も行う必要があります。ただし、H.HtmlSpock モナドとは何の関係もない type を指定しました。の間違った型シグネチャを削除し、それに応じloadFlightSeatて の使用を調整すると、この問題はおそらく解消されます。loadFlightSeat

     flightSeat <- loadFlightSeat -- Returns an H.Html value in the Spock monad.
     case fs of
        [] -> blaze $ template False (showResultAlertBar False "Oops, something went wrong! Please try again.")
        _  -> blaze $ template True (H.toHtml $ usersUsername l) flightSeat

PS:あなたが得たタイプエラー...

Couldn't match expected type ‘SqlBackend’
        with actual type ‘SpockConn Text.Blaze.Internal.MarkupM’
In the expression: runSQL
In a stmt of a 'do' block:
   sid <- runSQL $ getSeatIdByFlight fs' c

...によって定義されたモナドH.Html であり、 の同義語であるためMarkupM ()、非常に奇妙です。結果として、あなたが に与えた署名により、コンパイラは Spock のモナドを と一致させようとします。MarkupMblazeloadFlightSeatMarkupM

于 2015-08-14T03:29:02.780 に答える