Я подтвердил предположение в своем комментарии. Это потому, что вы указали тип в шаблоне. Это может быть тривиальное сопоставление с образцом, но это сопоставление с образцом, поскольку оно привязывает имя на LHS =
.
, которое даже по умолчанию не разрешено в Haskell. В GH C необходимо включить расширение ScopedTypeVariables, прежде чем оно будет разрешено. И когда вы делаете это, это оказывает странное влияние на полиморфизм. Я не понимаю всех взаимодействий между этим признаком и полиморфизмом более высокого ранга, но он определенно мономорфизирует тип и также ожидает, что он будет полиморфным c. Это просто не сработает.
Я настоятельно рекомендую помещать типы в шаблоны только в том случае, если вы связываете имя для самого типа вместе со значением. Иногда это возникает при работе с экзистенциалами, но я никогда не видел, чтобы это происходило ни в одном другом случае.
В противном случае, просто используйте синтаксис нормального типа для определения типа, даже если вам нужно добавить несколько точек с запятой для заставить его работать в ghci:
point :: Lens' Atom Point ; point = lens _point (\atom newPoint -> atom { _point = newPoint })