Странный класс типов в Haskell. что такое "класс (например, GenExpr e, MonadRandom m) => GenProg m e | e -> m где" - PullRequest
2 голосов
/ 12 декабря 2011
class (Eq e, GenExpr e, MonadRandom m) => GenProg m e | e -> m where

Точно, я не могу этого понять GenProg me |e -> m

Полагаю, GenProg - это конструктор.

означает ли это: тот, чей шаблон соответствует GenProg me или e ->m , чей экземпляр можно определить?

Кстати, где я могу получить весь синтаксис в haskell?

1 Ответ

7 голосов
/ 12 декабря 2011

Это класс многопараметрических типов с функциональной зависимостью. GenProg - это имя класса, двумя параметрами являются m (который должен быть экземпляром MonadRandom) и e (который должен быть экземпляром Eq и GenExpr). Затем | отделяет заголовок экземпляра от функциональной зависимости e -> m, которая говорит, что тип e в экземпляре определяет конструктор типа m, другими словами, для любого типа e может быть самый один m такой, что

instance GenProg m e where ...

появляется в допустимой программе. (То есть, если существует более одного такого объявления экземпляра с одним и тем же e, произойдет ошибка компиляции.)

...