2015-01-26 6 views
7

क्या जीएडीटी के लिए makeLenses के बराबर है? अगर मैं एक साधारण GADT की तरह है:जीएडीटी (हास्केल) के लिए मेकलेन्स

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

वहाँ एक रास्ता एक निर्माता और क्षेत्र नामों की सूची में गुजर द्वारा स्वचालित रूप से लेंस उत्पन्न करने के लिए है?

+2

मुझे पूछना है: क्या उन्हें हाथ से लिखना संभव है? – dfeuer

उत्तर

6

मुझे नहीं लगता कि यह स्वचालित रूप से किया जा सकता है, लेकिन हाथ से कुछ लेंस लिख इस विशेष मामले में है कि मुश्किल नहीं है:,

{-# 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 
-} 

वहाँ कुछ हद तक एक प्रासंगिक GitHub issue प्रतीत हो रहा है, जिसमें Kmett दावा है कि वे अस्तित्व में प्रमाणित क्षेत्रों के लिए लेंस नहीं बना सकते हैं।

संबंधित मुद्दे