Перебирая списки в блоке Haskell do?

Я прошу прощения за плохой заголовок, но я не совсем понимаю, как подвести итог.

Я новичок в Haskell, создаю веб-сайт на Haskell (Hakyll), используя шаблоны в Blaze-HTML, который использует нотацию 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" 

Теперь допустим, что я хочу быть СУХИМ здесь, чтобы у меня не было всех links, просто список URL в некотором понимании списка. Как бы я это сделал?

1 ответ

Решение

Ты можешь использовать mapM_ Вот:

thelinks :: [AttributeValue]
thelinks = ["list", "of", "hrefs"]

defaultTemplateRaw :: Html
defaultTemplateRaw = html $ do
    H.head $ do
        meta ! httpEquiv "Content-Type" ! content "text/html; charset=UTF-8"
        H.title "My Hakyll Blog - $title$"
        mapM_ ((link ! rel "stylesheet" ! type_ "text/css" !) . href) thelinks

Так что здесь мы используем mapM_ :: Monad m => (a -> m b) -> t a -> m () обрабатывать монадическую функцию ((link ! rel "stylesheet" ! type_ "text/css" !) . href) для каждого элемента списка thelinks,

Мы строим функцию, используя раздел оператора, поэтому:

(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>
Другие вопросы по тегам