2013-08-23 47 views
16

Tôi muốn chơi xung quanh với thư viện Lens một chút. Tôi đã tải nó vào GHCi và tạo ra một kiểu dữ liệu kỷ lục với dấu gạch thích hợp:Tôi làm cách nào để tạo các ống kính từ một bản ghi trong GHCi

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

Tôi muốn làm cho ống kính cho Foo sử dụng makeLenses mẫu. Tôi muốn làm điều này mà không cần phải đọc qua toàn bộ tập hợp Template-Haskell docs.

Tôi có thể nhập câu lệnh nào vào lời nhắc GHCi để làm việc này?

Trả lời

14

Tested trong 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 
:} 

(Tôi tin rằng khối :{ ... :} là cần thiết cho makeLenses làm việc).

Hãy kiểm tra ngắn gọn:

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

Điều đáng nói rằng 'makeLenses' gọi phải đi trong * cùng * ': {' khối như việc khai báo dữ liệu! Điều đó đã ném tôi cho một vòng lặp cho đến khi tôi figured nó ra. – kqr

+2

Đó là đủ để có _any_ tuyên bố trong: {khối cùng với 'makeLenses', (nó không phải là khai báo AST). Theo như tôi hiểu, thì ghci sẽ mở rộng danh sách khai báo 'makeLenses'. Nếu chỉ có một câu lệnh trong: {block, sau đó nó cố gắng mở rộng nó thành biểu thức, đưa ra lỗi không khớp loại. – max630