私は Edward Kmett のレンズライブラリを初めて使用しています。
[1] の質問は、存在量指定子が makeLenses を妨害することを説明しています。私はむしろ、何らかの形でレンズを使って実存的なものを使いたいと思っています.
背景として、私はクラスを持っています:
class (TextShow file, Eq file, Ord file, Typeable file) => File file where
fromAnyFile :: AnyFile -> Maybe file
fileType :: Simple Lens file FileType
path :: Simple Lens file Text.Text
provenance :: Simple Lens file Provenance
実際の質問については、次のタイプが必要です。
data AnyFile = forall file . File file => AnyFile { _anyFileAnyFile :: File }
そして、私は次の行に沿って何かを書きたいと思っています:
instance File AnyFile where
fromAnyFile (AnyFile file) = cast file
fileType (AnyFile file) = fileType . anyFile
path (AnyFile file) = path . anyFile
provenance (AnyFile file) = provenance . anyFile
[1] で説明した理由により、これは機能しません。でコンパイルして GHC にデバッグ情報を求めると-ddump-splices
、次のようになります。
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20
スプライス自体は空白です。これは、スプライスによって宣言が生成されないことを示しています。[1] を読んだ今、この部分を期待し、理解しています。
私が知りたいのは、これを行う方法です-問題を回避するにはどうすればよいですか? これで上流に泳がないようにするにはどうすればよいですか? 合成レンズのパスを介して構造の任意の部分にアクセスできるようにしたいのですが、 などのタイプの他のタイプのフィールドがあるため、レンズSet AnyFile
で のコンテンツにアクセスできない限りアクセスできませんAnyFile
。