Я не могу выяснить то, что "| m-> w" - часть означает в определении класса как это:
class (Monoid w, Monad m) => MonadWriter w m | m -> w
Какую дополнительную информацию это добавляет к определению класса?
Вертикальная черта - это синтаксический разделитель, не имеющий смысла. сам по себе, используемый для введения функциональных зависимостей для класса многопараметрического типа, поэтому технически |
вообще ничего не означает. Предположительно |
было выбрано в качестве визуальной аналогии использования того же символа для паттернов на функциях.
Что касается самих функциональных зависимостей, просто прочтите x -> y
как «параметр типа x
однозначно определяет параметр типа y
», что означает, что знания x
достаточно, чтобы найти правильный экземпляр. Есть и другие сложности, особенно с включенными другими расширениями GHC, но в большинстве случаев вам не нужно о них беспокоиться.
Напротив, без функциональных зависимостей выбор экземпляра класса многопараметрического типа требует, чтобы все параметры типа были известны. В типичном примере один параметр является типом контейнера, а второй - типом содержащихся в нем элементов; такие функции, как «concatenate» или «isEmpty», могут не упоминать тип элемента, а только тип контейнера, и поэтому будут неоднозначными.
Кроме того, если вы пишете свои собственные классы типов, рассмотрите возможность использования семейств типов , которые представляют собой новый подход, который в конечном итоге может заменить функциональные зависимости. Грубо говоря, семейства типов позволяют писать перегруженные определения типов внутри экземпляра, а не только перегруженные функции.