a = Reader { runReader :: r -> a }
И есть функция, которая "меняет" окружение Reader'а, напоминающее fmap:
local :: (r -> r) -> Reader r a -> Reader r a
local f m = Reader $ \e -> runReader m (f e)
Теперь задача такова, что мне нужно вывести контравариантную реализацию этой функции:
local2 :: (r -> e) -> Reader e a -> Reader r a
Вопрос:
Я же правильно понимаю, что если проводить аналогию с контравариантной композицией, то отличие local от local2 будет лишь в том, что в сигнатуре параметры поменяются ролями?
local2 :: (r -> e) -> Reader e a -> Reader r a
Если это верно, то функция (r -> e) возьмет на себя роль Reader r a, в него и необходимо будет прокинуть новое "окружение", а Reader e a примет на себя роль той самой функции, которую лифтят ближе к старому окружению, чтобы произвести новое.
Следуя своей этой догадке, я попытался реализовать контравариантную версию:
local2 f m = Reader $ \e -> runReader (Reader f) (runReader m (f e))
получил такую сигнатуру от type inference'а:
local2 :: (r -> a) -> Reader a r -> Reader r a
Не получилось оставить второй аргумент Reader'а "fixed" 😞
Верное ли обьяснение контравариантности я дал? Подскажите, как следует разрешить проблему выше, где в сигнатуре второй аргумент модифицируется?
ребят а как сделать такой зелёный текст как вот тут?
Не знаю о каком зеленом тексте речь, так как он у меня обычный, но подозреваю, что там вина всему форматирование текста в телеграме. Выделите текст и нажмите правой кнопкой мыши чтобы увидеть опции по его форматированию
Возможно сидите с десктопа или браузера. Тогда если сообщение было использовано с форматированием типа ()х3 haskell ()х3 то будет выделение синтаксиса
Обсуждают сегодня