Проблема заключается в использовании 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]
.
На этом этапе средство проверки типов просто сдается и сообщает пользователю о сбивающей с толку проблеме.