13

レンズパッケージでコーディングしていました。代数型の特定のフィールドにアクセスしようとするまで、すべてがうまくいっていました。

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

しかし、存在しなければならない何かに対して、その可能性から抜け出すのはちょっと奇妙です。

4

1 に答える 1