Элемент Lucid Nav выдает ошибку в списке атрибутов - PullRequest
0 голосов
/ 04 июня 2019

В настоящее время я переписываю HTML-файл в Lucid для использования с веб-сервером Spock. Однако по какой-то причине этот конкретный фрагмент дает мне ошибку:

sidebar :: Html ()
sidebar = do
  nav_ [id_ "sidebar"] $ do
    div [class_ "sidebar-header"] $
      h3_ "Sidebar"

    div [class_ "list-group"] $ do
      a_ [href_ "#", class_ "menuItem list-group-item rounded-0"] "Item 1"
      a_ [href_ "#", class_ "menuItem list-group-item rounded-0"] "Item 2"

А именно ошибка:

Couldn't match type `[Attribute]'
               with `HtmlT Data.Functor.Identity.Identity ()'
  arising from a use of `nav_'

Я заметил, что удаление div и просто наличие h3 решает проблему, но это не то, что я хочу. Я попытался найти проблему, но, судя по всему, в библиотеке не так много примеров в Интернете, на которые я мог бы попытаться взглянуть. Поиск Stackoverflow и Reddit также ничего не выявил.

Это мой первый настоящий проект, в котором я использовал Lucid, поэтому вполне возможно, что где-то есть явная ошибка.

1 Ответ

0 голосов
/ 04 июня 2019

Проблема заключается в использовании div (целочисленное деление) вместо div_ (элемент HTML).

Ошибка типа немного причудлива, но возникает из-за того, как средство проверки типов пытается вывеститип для всего выражения.

class_ имеет тип

class_ :: Text -> Attribute

Таким образом [class_ "list-group"] :: [Attribute].Это просто.

div имеет тип

div :: Integral a => a -> a -> a

Существует ограничение Integral, но, что более важно, оба типа ввода и тип результата должны быть одинаковыми.

В выражении типа

div [class_ "list-group"] $ do
  a_ [href_ "#", class_ "menuItem list-group-item rounded-0"] "Item 1"
  a_ [href_ "#", class_ "menuItem list-group-item rounded-0"] "Item 2"

средство проверки типов заключает, что [class_ "list-group"], do ... и все выражение div ... ... имеют одинаковый тип.

Мы знаемпервый тип, поэтому мы заключаем do { a_ ...; a_ ... } :: [Attribute] и div [...] $ do ... :: [Attribute].

Это использование div является последним оператором в блоке do, что означает, что его тип также является типом целого do expression.

В следующей части я немного размыт, но я думаю, что средство проверки типов смотрит на

nav_ :: Term arg result => arg -> result

и

class Term arg result | result -> arg

и на доступныеTerm экземпляров и делает вывод, что поскольку объявленный тип результата равен sidebar :: Html (), второй аргумент nav_ (блок do) также должен иметь тип Html (), который является псевдонимом для HtmlT Identity ().

Теперь у нас есть конфликт: объявленная подпись типа говорит, что вторым аргументом nav_ должно быть HtmlT Identity (), но выводится tТип [Attribute].

На этом этапе средство проверки типов просто сдается и сообщает пользователю о сбивающей с толку проблеме.

...