2015-01-26 31 views
7

GADT'ler için makeLenses eşdeğeri var mı? Ben gibi basit GADT varsa:makeLenses (Haskell)

data D a b where 
    D :: (Ord a, Ord b) => !a -> !b -> D a b 

yapıcı ve alan adlarına bir listede ileterek otomatik lensleri üretmek için bir yolu var mı?

+2

Sormak zorundayım: el ile yazmak mümkün mü? – dfeuer

cevap

6

Ben otomatik olarak yapılır, ancak elle bazı lensler yazma bu özel durumda o kadar da zor değildir edilebilir sanmıyorum: hangi,

{-# LANGUAGE GADTs #-} 

import Control.Lens 

data D a b where 
    D :: (Ord a, Ord b) => !a -> !b -> D a b 

field1 :: Lens' (D a b) a 
field1 f (D x y) = fmap (\x' -> D x' y) (f x) 

field2 :: Lens' (D a b) b 
field2 f (D x y) = fmap (\y' -> D x y') (f y) 

{- If you want type-changing lenses, you can also use these signatures. 
- Note that then the target type Ord constraint has to escape. 

field1 :: (Ord a2) => Lens (D a1 b) (D a2 b) a1 a2 
field2 :: (Ord b2) => Lens (D a b1) (D a b2) b1 b2 
-} 

bir şekilde alakalı GitHub issue gibi görünüyor Kmett Varoluşsal olarak nicelenmiş alanlar için lens oluşturamadıklarını iddia ediyor.