Я кодировал пакет объектива. Все шло хорошо, пока я не попытался получить доступ к определенному полю по алгебраическому типу:
import Control.Lens
data Type = A { _a :: Char } | B
makeLenses ''Type
test1 = _a (A 'a')
test2 = (A 'a') ^. a
No instance for (Data.Monoid.Monoid Char)
arising from a use of `a'
Possible fix:
add an instance declaration for (Data.Monoid.Monoid Char)
In the second argument of `(^.)', namely `a'
In the expression: (A 'a') ^. a
In an equation for `test2': test2 = (A 'a') ^. a
Я мог бы просто пойти с _a, но тип данных в моей реальной программе намного глубже, и я хотел бы использовать объектив, чтобы уменьшить объем работы, которую я должен выполнить. Я просматриваю библиотеку объективов, но там так много, и я не уверен, справился ли он с этим сценарием, или это просто то, что не поддерживает библиотека объективов.
В качестве побочного примечания, если я действительно использую моноид как String для типа данных вместо Char, он затем компилирует и дает правильный ответ, я понятия не имею, почему.
Изменить: после прочтения комментария hammar, я пробовал это, и это работает:
test2 = (A 'a') ^? a
test3 = B ^? a
Но это странно, чтобы получить, возможно, из этого для чего-то, что должно существовать.