Objektif paketi ile kodlama yapıyordum. Bir cebirsel türüne Belirli bir alanı erişmeye çalıştı kadar her şey iyi gidiyordu:Cebirsel tipli lens paketi
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
Sadece _A ile gidebiliriz, ama benim gerçek programda veri türü çok daha derin ve ben tür Merceği kullanarak hedeflenen Yapmam gereken iş miktarını azalt. Objektif kütüphanesine baktım ama orada çok fazla var ve bu senaryo ile ilgilenip ilgilenmediğinden emin değilim ya da objektif kütüphanesinin desteklemediği bir şey.
Bir yan not olarak, aslında Char yerine veri türü için tekdüze bir String'i kullanırsam, daha sonra derler ve doğru yanıtı verir, neden olduğunu bilmiyorum.
Düzenleme: Hammar yorumuna okuduktan sonra bu denenmiş ve bu işler:
test2 = (A 'a') ^? a
test3 = B ^? a
Ama garip varolmaya olan bir şey için bunun dışında bir belki elde etmektir.
Lens paketinin iç işleyişine aşina değil, ama: Ne olduğunu düşünün. a' dönmelidir. Bir şey seçmek zorundadır, bu yüzden 'memecy '' _a B' gibi bir istisna atmak yerine bir varsayılan olarak kullanmaya çalışır. – hammar
_a B'nin derleyeceği hakkında hiçbir fikrim yoktu. Kodumda, çalışma zamanına kadar orada olduğunu anlayamayacağım bir hata vardı ve Duvar ile ilgili bir uyarı bile yoktu. Yani, sanırım^kullanacağım? ve belki de işlev ve tam olarak ihtiyacım olan şeyi yapar. –
Aslında ikinci düşünceme göre, cebirsel tiplerdeki erişim metotlarının sadece kötü bir fikir olduğunun farkına vardım. Buna izin verildiğine şaşırdım. Programımda, sadece temizlediğim çok fazla hata vardı. –