2013-06-16 23 views
8

Việc triển khai makeLenses tiêu chuẩn tạo ra thấu kính cho tất cả các trường của bản ghi bắt đầu bằng dấu gạch dưới. Tôi rất không thích ý tưởng phải giới thiệu một quy ước đặt tên khó xử như vậy vào hồ sơ của tôi vì nhiều lý do. Những gì tôi muốn làm là chỉ tạo ra ống kính cho tất cả các lĩnh vực của một bản ghi và đặt tên cho chúng bằng cách chỉ thêm một hậu tố "L" vào tên trường.Tạo ống kính cho thư viện "ống kính" với bộ xử lý tên tùy chỉnh thay vì mặc định "gạch dưới" dựa trên một

Với một fc-nhãn thư viện tất cả tôi phải làm gì để đạt được điều đó là

mkLabelsWith (++ "L") [''MyRecord] 

nhưng ống kính thư viện có một cấu hình nhiều hơn tham gia với rulesets và các công cụ, mà không phải là dễ dàng để có được một tâm trí xung quanh. Vì vậy, tôi yêu cầu một công thức cụ thể để đạt được điều tương tự.

Trả lời

15

Nhìn vào mã, có vẻ như khá đơn giản. LensRules có chức năng lensField :: String -> Maybe String (tên này cung cấp tên cho ống kính hoặc không thành công). Vì vậy, bạn có thể thực hiện một chức năng như

myMakeLenses = makeLensesWith $ lensRules 
    & lensField .~ (\name -> Just (name ++ "L")) 

và sử dụng thay vì makeLenses. Tất nhiên bạn có thể tham số hóa chức năng của bạn trên (++ "L").

Hoặc bạn có thể viết nội tuyến nếu muốn, ví dụ:

makeLensesWith ?? ''Foo $ lensRules 
    & lensField .~ (\name -> Just (name ++ "L")) 

(Lưu ý rằng (??) chỉ là Infix flip để thông qua các đối số theo thứ tự đúng. Bạn có thể nghĩ về nó như một "lỗ" trong trường hợp này là số thứ hai được điền vào. Và (&) chỉ là lộn ($).)

+0

Tuyệt vời! Cảm ơn nhiều! –

+0

lưu ý rằng hiện tại đã bị hỏng với ống kính-4.4 đã sửa đổi mã liên quan đến mẫu-haskell. –

18

Câu trả lời của shachaf không hoạt động với ống kính 4.4+ đã thay đổi API liên quan đến mẫu-haskell.

Đây là việc thực hiện hoạt động với các phiên bản:

import Language.Haskell.TH 

myMakeLenses :: Name -> DecsQ 
myMakeLenses = makeLensesWith $ lensRules 
    & lensField .~ \_ _ name -> [TopName (mkName $ nameBase name ++ "L")] 

(đây là 4.5+, trong 4,4 lambda sẽ chỉ mất \_ name như các thông số)

Các vấn đề liên quan