2013-08-23 10 views
16

Chciałbym trochę pobawić się z biblioteką Lens. Mam załadowany go do GHCi i stworzył typ danych rekordu z odpowiednimi podkreślenia:Jak wykonać soczewki z rekordu w GHCi

> data Foo a = Foo {_arg1 :: Int, _arg2 :: [a]} 

Chciałbym, aby soczewki dla Foo pomocą szablonu makeLenses. Chciałbym to zrobić bez konieczności czytania całego zestawu Template-Haskell docs.

Jakie zaklęcie mogę wpisać w podpowiedzi GHCi, aby to zadziałało?

Odpowiedz

14

Testowane GHCi 7.8.3:

:set -XTemplateHaskell 
:m +Control.Lens 
:{ 
data AST = AInt { _aid :: Int, _ival :: Int } 
     | AChar { _aid :: Int, _cval :: Char } 
     deriving (Show) 
makeLenses ''AST 
:} 

(wierzę, że blok :{ ... :} jest konieczne dla makeLenses do pracy). krótko check

Miejmy:

λ >> AChar 100 'f' ^. aid 
100 
λ >> AChar 100 'f' ^? cval 
Just 'f' 
λ >> AInt 101 0 ^? cval 
Nothing 
+2

Warto wspomnieć, że 'makeLenses' wezwanie musi iść w * samo *' { 'blok jako deklaracji danych! To rzuciło mnie na pętlę, dopóki się nie zorientowałem. – kqr

+2

Wystarczające jest zdanie _any_ w: {bloku razem z 'makeLenses', (nie musi to być deklaracja AST). O ile rozumiem, to ghci rozszerzy "makeLenses" jako listę deklaracji. Jeśli istnieje tylko jedna instrukcja w: {block, wówczas próbuje rozszerzyć ją jako wyrażenie, podając błąd niedopasowania typu. – max630