Я не смог точно понять это, прочитав доступный документы.
В разделе записи документов Type это, похоже, связано с полиморфизмом строк, но я не понимаю, как это обычно используется. Что это значит, когда есть подпись типа с символом |
?
Например:
class Monad m <= MonadTell w m | m -> w where
tell :: w -> m Unit
Канал в PureScript не используется «вообще». Есть несколько вариантов его использования в зависимости от контекста. Один, как вы упомянули, предназначен для комбинаций строк типов. Другой предназначен для функции охранников.
Конкретный синтаксис, который вы цитируете, называется «функциональной зависимостью». Это свойство класса типов с несколькими параметрами, и оно указывает, что одни переменные должны однозначно определяться другими.
В данном конкретном случае синтаксис означает «на каждый m
может быть только один w
».
Или, проще говоря, данное m
не может быть MonadTell
для нескольких разных w
.
Функциональные зависимости проявляются во многих других местах. Например:
-- For every type `a` there is only one generic representation `rep`
class Generic a rep | a -> rep where
-- Every newtype `t` wraps only one unique inner type `a`
class Newtype t a | t -> a where
Другой способ сформулировать это для этих примеров — сказать, что тип
a
определяет типrep
дляGeneric
, аt
определяетa
дляNewtype
. Такое описание также как бы иллюстрирует, как функциональные зависимости могут использоваться в качестве функций уровня типа.