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

Я не могу выяснить то, что "| m-> w" - часть означает в определении класса как это:

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

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

54
задан Don Stewart 18 April 2011 в 14:35
поделиться

2 ответа

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

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

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

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

47
ответ дан 7 November 2019 в 08:08
поделиться

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

14
ответ дан 7 November 2019 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: