Ответ 1
Это нормальная вещь. Библиотека lens
в значительной степени опирается на полиморфизм, поэтому ограничение мономорфизма (что делает вещи менее полиморфными, чем они могут быть) не так хорошо взаимодействует с ним. В вашем случае, я думаю, вы также можете написать свой код следующим образом:
meetupLat :: Lens' Meetup Latitude
meetupLat = location._1
Если вы указываете явную подпись полиморфного типа для привязки, ограничение мономорфизма не имеет значения.
Обратите внимание, что Lens' Meetup Latitude
является полиморфным типом, хотя он выглядит мономорфным. Переменные типа скрыты внутри синонима типа Lens'
. В частности:
Lens' Meetup Latitude
определяется как Lens Meetup Meetup Latitude Latitude
.
И Lens Meetup Meetup Latitude Latitude
определяется как forall f. Functor f => (Meetup -> f Meetup) -> Latitude -> f Latitude
Итак, это все о f
. Я думаю, что ограничение мономорфизма будет приводить к конкретному экземпляру f
, но вы хотите сохранить его полиморфным, потому что разные пользователи объектива будут выбирать разные f
. Например view
выберет Const
и set
выберет Identity
. Поэтому очень важно, чтобы полиморфный f
позволял пользователям этого объектива выбирать.