2011-12-14 40 views
6

Tôi có một số soạn sẵn Haskell mà trông giống như sau:Haskell động dữ liệu kiểu thay đổi

data Configuration 
    { confA :: Integer 
    , confB :: Boolean 
    , confC :: String } 

x = (\arg opt -> opt{ confA=arg }) 
y = (\arg opt -> opt{ confB=arg }) 
z = (\arg opt -> opt{ confC=arg }) 

và tôi muốn để loại bỏ các soạn sẵn, năng suất một cái gì đó dọc theo dòng:

setter :: (Config -> a) -> a -> Config -> Config 
x = setter confA 
y = setter confB 
z = setter confC 

Nhưng tôi không có ý tưởng làm thế nào để xây dựng một chức năng setter như vậy. Điều này thậm chí có thể trong (không mẫu) haskell hoặc tôi butting lên chống lại cú pháp đường ở đây? Nếu vậy, làm thế nào tôi sẽ làm một điều như vậy trong mẫu haskell?

Trả lời

13

Điều này là không thể với hệ thống hồ sơ của Haskell. Những gì bạn muốn là ống kính; này previous Stack Overflow question và câu trả lời hàng đầu của nó là một giới thiệu tốt. Cá nhân, tôi sử dụng gói data-lens được nói đến ở đó. (Xem thêm data-lens-fd sử dụng nó với lớp MonadState từ mtl - nếu bạn không biết đó là gì, chỉ biết rằng có lẽ bạn nên sử dụng nó bất cứ khi nào bạn muốn sử dụng ống kính trong một đơn nguyên State.)

Các data-lens-template gói có thể là ứng dụng của mẫu Haskell bạn muốn; nó bắt nguồn từ định nghĩa ống kính cho các trường bản ghi.

Gói thấu kính phổ biến khác là fclabels. Tôi thích ống kính dữ liệu cho sự đơn giản và tốc độ của nó; fclabels (như phiên bản 1.0) hơi linh hoạt hơn, nhưng bạn không cần sự linh hoạt đó cho những gì bạn muốn làm. (Lưu ý rằng do tính linh hoạt mới tăng của nó, loại fclabels '(:->) có thể không còn được dịch trực tiếp sang định nghĩa đơn giản của ống kính, như được đề cập trong câu trả lời chồng tràn tôi liên kết.)

1

Điều này là không thể nếu không có Mẫu Haskell. Bạn có thể sử dụng dữ liệu-accessor và dữ liệu-accessor-template để loại bỏ tấm nồi hơi như vậy.

+0

Tôi tin điều này là chính xác. Cú pháp ghi tự động tạo * getters * cho bạn, nhưng chúng hầu như vô dụng khi bạn muốn tạo * setters *. –

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