レンズパッケージでコーディングしていました。代数型の特定のフィールドにアクセスしようとするまで、すべてがうまくいっていました。
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 をそのまま使用することもできますが、実際のプログラムのデータ型はもっと深く、lens を使用して作業量を減らすつもりでした。私はレンズ ライブラリを調べてきましたが、そこにはたくさんあります。彼がこのシナリオに対処したのか、それとも単にレンズ ライブラリがサポートしていないものなのかはわかりません。
補足として、データ型に Char の代わりに String のようなモノイドを実際に使用すると、コンパイルされて正しい答えが得られますが、その理由はわかりません。
編集:hammarのコメントを読んだ後、これを試してみましたが、これは機能します:
test2 = (A 'a') ^? a
test3 = B ^? a
しかし、存在しなければならない何かに対して、その可能性から抜け出すのはちょっと奇妙です。