Я только что установил библиотеку lens
, поэтому я могу легко set
использовать вложенную структуру данных. Однако я столкнулся с проблемой. Вот минимальный пример, демонстрирующий мою проблему
Следующий код не компилируется:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data MyRecord = MyRecord
{ _func :: forall . a -> a
}
makeLenses ''MyRecord
changeMyRecord :: MyRecord -> MyRecord
changeMyRecord r = r & func .~ id
Ошибка No Instance for (Contravariant Identity) arising from use of 'func'
.
Я просмотрел Contravariant
и почти уверен, что мне невозможно создать этот экземпляр, так как
class Contravariant f where
contramap :: (a -> b) -> f b -> f a
т. е. если f = \x -> x
я не вижу, где я могу найти что-то типа a
для применения к аргументу функции (a-> b)
Есть ли другой способ изменить MyRecord
с помощью линз? Или я мог бы как-то избежать RankNTypes
, но все же обойти полиморфный _func
в своей записи? Или что-то другое?
Синтаксис обновления записи неуместен — представьте, что MyRecord
глубоко вложен.
Пожалуйста, предполагайте, что вы очень мало знаете Haskell при ответе, в частности, я только сегодня начал просматривать библиотеку объективов.