Chấp nhận câu trả lời của ehird. Tôi chỉ viết điều này để tôi có thể giải thích các destructor thông minh tôi đã đề cập trong một bình luận và tôi không thể phù hợp với lời giải thích trong một bình luận.
Hãy nói rằng bạn có các loại:
data T x y z = A | B x | C y z
ehird đã giải thích làm thế nào để tóm tắt đi các nhà xây dựng, mà chỉ là cung cấp cho nhà xây dựng "thông minh". Như bạn đã đề cập, điều này đòi hỏi phải ẩn các nhà xây dựng và sau đó bạn không thể sử dụng chúng để phù hợp với mẫu. Tuy nhiên, bạn có thể giải quyết điều này bằng cách sử dụng một destructor "thông minh", tương đương với mô hình phù hợp với tất cả các nhà xây dựng có thể.
Để giải thích điều này, trước tiên hãy bắt đầu với cách chúng tôi muốn viết một chức năng của loại T nếu các nhà thầu đã được tiếp xúc:
myFunction :: T x y z -> d
myFunction t = case t of
A -> f1
B x -> f2 x
C y z -> f3 y z
Chúng ta biết từ chữ ký kiểu của hàm các loại f1
, f2
, và f3
phải:
f1 :: d
f2 :: x -> d
f3 :: y -> z -> d
Vì vậy, nếu chúng ta có thể khái quát myFunction
là một destructor thông minh, chúng ta chỉ cần vượt qua f1
, f2
, và f3
như tham số cho nó:
smartDestructor :: d -> (x -> d) -> (y -> z -> d) -> t -> d
smartDestructor f1 f2 f3 t = case t of
A -> f1
B x -> f2 x
C y z -> f3 y z
Vì vậy, nếu bạn xuất smartDestructor
, sau đó mọi người có thể về cơ bản mô hình trận đấu chống lại loại của bạn mà không cần phải truy cập vào các nhà xây dựng.
Nếu bạn đã từng sử dụng các maybe
hoặc either
chức năng, trước đó, sau đó bạn đã sử dụng một destructor thông minh, mặc dù trong những trường hợp các nhà thầu không phải là ẩn, vì vậy họ chủ yếu được cung cấp như các chức năng tiện theo dõi:
maybe :: b -> (a -> b) -> Maybe a -> b
maybe f1 f2 m = case m of
Nothing -> f1
Just a -> f2 x
either :: (a -> c) -> (b -> c) -> Either a b -> c
either f1 f2 e = case e of
Left a -> f1 a
Right b -> f2 b
Trong trường hợp của bạn, mục đích của phá hủy thông minh chỉ là để bạn có thể ẩn các nhà xây dựng và không để lộ các nhà xây dựng.
bản sao có thể có của [Cách tạo loại có hạn chế] (http://stackoverflow.com/questions/7978191/how-to-make-a-type-with-restrictions) – ehird