Haskell submonand泄漏(blaze html空输出,格式为u3;)

Haskell submonand泄漏(blaze html空输出,格式为u3;),haskell,monads,ghc,Haskell,Monads,Ghc,我正在用blaze html库编写一个web应用程序。 静态内容生成时没有问题,但我坚持生成动态内容 -- compiles, runs but expanded into empty string forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x) 看来这次bug潜入了Haskell类型检查器 我的调查 :t forM_ forM_ :: (Foldable t, Monad m) => t a -> (a -

我正在用blaze html库编写一个web应用程序。 静态内容生成时没有问题,但我坚持生成动态内容

-- compiles, runs but expanded into empty string
forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x) 
看来这次bug潜入了Haskell类型检查器

我的调查

:t forM_
forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m ()

:t   (H.p . H.toHtml . show) 
(H.p . H.toHtml . show) :: Show a => a -> H.Html


:t  (\x -> return $ (H.p . H.toHtml . show)  x)
(\x -> return $ (H.p . H.toHtml . show)  x)
  :: (Monad m, Show a) => a -> m H.Html

type H.Html = H.Markup
type H.Markup = H.MarkupM ()
instance Monand H.MarkupM 

因此,在正确的情况下,“mb”=“MarkupM()”和标记在从循环返回时保留。 在错误情况下,“mb”=“m(MarkupM())”和m是受Monad类约束的某种类型构造函数。 所以H.toHtml创建新的MarkupM,由H.p填充,然后子MarkukM被丢弃,对吗

如何处理这种错误

这是应用程序:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators   #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}

module Lib
    ( startApp
    , app
    ) where


import Data.Aeson
import Data.Aeson.TH
import Network.Wai
import Network.Wai.Handler.Warp
import Servant
import Control.Monad (forM_)
import Servant.HTML.Blaze
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A

type API = Get '[HTML] H.Html

api :: Proxy API
api = Proxy


endpoint :: Handler H.Html
endpoint = do
  return $ H.docTypeHtml $ do
    H.head $ do
      H.title "title"
    H.body $ do
      H.h1 "header"
      forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x)

app :: Application
app = serve api (hoistServer api id endpoint)

startApp :: IO ()
startApp = runSettings defaultSettings app


为什么其中一个中有
return
,而另一个中没有?(提示:这是你的问题)。我放了return,以防万一,我希望类型检查器无论如何都能指出问题。我不理解“按预期工作”的代码段。那里有什么?什么是
x
?@RobinZigmond当然也有缺少
表单
执行副作用并丢弃结果。
返回
没有副作用。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators   #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}

module Lib
    ( startApp
    , app
    ) where


import Data.Aeson
import Data.Aeson.TH
import Network.Wai
import Network.Wai.Handler.Warp
import Servant
import Control.Monad (forM_)
import Servant.HTML.Blaze
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A

type API = Get '[HTML] H.Html

api :: Proxy API
api = Proxy


endpoint :: Handler H.Html
endpoint = do
  return $ H.docTypeHtml $ do
    H.head $ do
      H.title "title"
    H.body $ do
      H.h1 "header"
      forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x)

app :: Application
app = serve api (hoistServer api id endpoint)

startApp :: IO ()
startApp = runSettings defaultSettings app