遍历 Haskell 中的列表会阻塞吗?
Iterating over lists in Haskell do block?
对于糟糕的标题,我深表歉意,但我不太清楚如何总结这一点。
我是一个 Haskell 初学者,使用 Blaze-HTML 中的模板在 Haskell (Hakyll) 中制作了一个网站,它使用 do 表示法来制作 HTML。这是我的模板的一部分:
defaultTemplateRaw :: Html
defaultTemplateRaw = html $ do
H.head $ do
meta ! httpEquiv "Content-Type" ! content "text/html; charset=UTF-8"
H.title "My Hakyll Blog - $title$"
link ! rel "stylesheet" ! type_ "text/css" ! href "/css/main.css"
link ! rel "stylesheet" ! type_ "text/css" ! href "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
link ! rel "stylesheet" ! type_ "text/css" ! href "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
现在假设我想在这里保持干爽,所以我不会有所有的 link
s,只是某种列表理解中的 URL 列表。我该怎么做?
你可以在这里使用mapM_
:
<b>thelinks :: [AttributeValue]
thelinks = ["list", "of", "hrefs"]</b>
defaultTemplateRaw :: Html
defaultTemplateRaw = html $ do
H.head $ do
meta ! httpEquiv "Content-Type" ! content "text/html; charset=UTF-8"
H.title "My Hakyll Blog - $title$"
<b>mapM_ ((link ! rel "stylesheet" ! type_ "text/css" !) . href) thelinks</b>
所以这里我们使用mapM_ :: Monad m => (a -> m b) -> t a -> m ()
来为列表thelinks
.
的每个元素处理单子函数((link ! rel "stylesheet" ! type_ "text/css" !) . href)
我们使用operator section构造函数,所以:
(link ! rel "stylesheet" ! type_ "text/css" !)
等同于:
\x -> link ! rel "stylesheet" ! type_ "text/css" ! x
但是我们不能直接将 AttributeValue
作为 x
传递给该函数:我们需要使用 href
属性,我们通过使用 . href
来实现,因此因此意味着:
(link ! rel "stylesheet" ! type_ "text/css" !) . href
-----------------------------------------------------------------------
= (\x -> link ! rel "stylesheet" ! type_ "text/css" ! x) . href
-----------------------------------------------------------------------
= \y -> (\x -> link ! rel "stylesheet" ! type_ "text/css" ! x) (href y)
-----------------------------------------------------------------------
= \y -> (link ! rel "stylesheet" ! type_ "text/css" ! (href y))
因此,在列表项上调用 href
函数在语法上更方便,结果是 link ! ...
.
的结构
对于给定的样本列表,这会产生:
Main L R> putStrLn $ L.unpack $ R.renderHtml defaultTemplateRaw
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>My Hakyll Blog - $title$</title><link rel="stylesheet" type="text/css" href="list"><link rel="stylesheet" type="text/css" href="of"><link rel="stylesheet" type="text/css" href="hrefs"></head></html>
对于糟糕的标题,我深表歉意,但我不太清楚如何总结这一点。
我是一个 Haskell 初学者,使用 Blaze-HTML 中的模板在 Haskell (Hakyll) 中制作了一个网站,它使用 do 表示法来制作 HTML。这是我的模板的一部分:
defaultTemplateRaw :: Html
defaultTemplateRaw = html $ do
H.head $ do
meta ! httpEquiv "Content-Type" ! content "text/html; charset=UTF-8"
H.title "My Hakyll Blog - $title$"
link ! rel "stylesheet" ! type_ "text/css" ! href "/css/main.css"
link ! rel "stylesheet" ! type_ "text/css" ! href "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
link ! rel "stylesheet" ! type_ "text/css" ! href "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
现在假设我想在这里保持干爽,所以我不会有所有的 link
s,只是某种列表理解中的 URL 列表。我该怎么做?
你可以在这里使用mapM_
:
<b>thelinks :: [AttributeValue]
thelinks = ["list", "of", "hrefs"]</b>
defaultTemplateRaw :: Html
defaultTemplateRaw = html $ do
H.head $ do
meta ! httpEquiv "Content-Type" ! content "text/html; charset=UTF-8"
H.title "My Hakyll Blog - $title$"
<b>mapM_ ((link ! rel "stylesheet" ! type_ "text/css" !) . href) thelinks</b>
所以这里我们使用mapM_ :: Monad m => (a -> m b) -> t a -> m ()
来为列表thelinks
.
((link ! rel "stylesheet" ! type_ "text/css" !) . href)
我们使用operator section构造函数,所以:
(link ! rel "stylesheet" ! type_ "text/css" !)
等同于:
\x -> link ! rel "stylesheet" ! type_ "text/css" ! x
但是我们不能直接将 AttributeValue
作为 x
传递给该函数:我们需要使用 href
属性,我们通过使用 . href
来实现,因此因此意味着:
(link ! rel "stylesheet" ! type_ "text/css" !) . href
-----------------------------------------------------------------------
= (\x -> link ! rel "stylesheet" ! type_ "text/css" ! x) . href
-----------------------------------------------------------------------
= \y -> (\x -> link ! rel "stylesheet" ! type_ "text/css" ! x) (href y)
-----------------------------------------------------------------------
= \y -> (link ! rel "stylesheet" ! type_ "text/css" ! (href y))
因此,在列表项上调用 href
函数在语法上更方便,结果是 link ! ...
.
对于给定的样本列表,这会产生:
Main L R> putStrLn $ L.unpack $ R.renderHtml defaultTemplateRaw
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>My Hakyll Blog - $title$</title><link rel="stylesheet" type="text/css" href="list"><link rel="stylesheet" type="text/css" href="of"><link rel="stylesheet" type="text/css" href="hrefs"></head></html>