Подтвердить что ты не робот

Что такое "|" для определения класса Haskell?

Я не могу понять, что означает "| m → w" -part в определении класса следующим образом:

class (Monoid w, Monad m) => MonadWriter w m | m -> w

Какую дополнительную информацию это добавляет к определению класса?

4b9b3361

Ответ 1

Вертикальная черта - синтаксический разделитель, не имеющий никакого значения, используемый для ввести функциональные зависимости в класс с несколькими параметрами, поэтому технически | ничего не значит. Предположительно | был выбран в качестве визуальной аналогии с тем же символом, что и для шаблонов шаблонов для функций.

Что касается самих функциональных зависимостей, просто прочитайте x -> y, поскольку "параметр типа x однозначно определяет параметр типа y", а это значит, что знать только x достаточно, чтобы найти правильный экземпляр. Существуют и другие осложнения, особенно с включенными расширениями GHC, но большую часть времени вам не нужно беспокоиться о них.

Напротив, без функциональных зависимостей выбор экземпляра класса с несколькими параметрами требует, чтобы все параметры типа были известны. Типичный пример имеет один параметр, являющийся типом контейнера, а второй - типом содержащихся элементов; такие функции, как "concatenate" или "isEmpty", не должны упоминать тип элемента, только тип контейнера и, следовательно, будут неоднозначными.

Кроме того, если вы пишете свои собственные классы типов, вместо этого используйте типы семейств, которые являются новым подходом, который может в конечном итоге заменить функциональных зависимостей. Грубо говоря, типы семейств позволяют писать перегруженные определения типов внутри экземпляра, а не только перегруженные функции.

Ответ 2

Определяет функциональную зависимость .