Ehird'in cevabını kabul edin. Bunu yazıyorum, böylece yorumda bahsettiğim akıllı yıkıcıları açıklayabiliyorum ve bir açıklamada açıklamaya uymayacağım.
data T x y z = A | B x | C y z
ehird zaten adildir yapıcı, "akıllı" kurucular nasıl sağlanacağı için soyut uzak açıkladı:
Diyelim ki türüne sahip olduğunu varsayalım. Bahsettiğiniz gibi, bu da kurucuları saklamayı gerektirir ve daha sonra bunları desen eşleştirmesi için kullanamazsınız. Ancak bunu, her olası kurucuya karşı desen eşleşmesiyle eşdeğer bir "akıllı" yıkıcıyı kullanarak çözebilirsiniz.
Bunu açıklamak için, kurucular maruz bırakıldı eğer ilk biz T türünde bir işlev yazacağımı nasıl başlayalım:
myFunction :: T x y z -> d
myFunction t = case t of
A -> f1
B x -> f2 x
C y z -> f3 y z
Biz işlevin tip imzadan biliyorum f1
, f2
çeşitleri, ve f3
olmalıdır: Yani
f1 :: d
f2 :: x -> d
f3 :: y -> z -> d
biz akıllı yıkıcı olmaya myFunction
genelleme olsaydı, biz sadece f1
, f2
vegeçmesikendisine parametreler olarak:
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
Yani smartDestructor
dışa eğer, o zaman insanlar can yapıcıları erişimi gerek kalmadan tip karşı temelde desen maç. Hiç maybe
veya either
fonksiyonlarını kullandıysanız
, bu durumlarda kurucular gizli olmadıkları halde önce, o zaman, akıllı yıkıcı kullandım, bu yüzden çoğunlukla kolaylık işlevleri olarak verilmektedir:
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
Sizin durumunuzda, akıllı yıkıcının amacı, kurucuları gizleyebilmeniz ve kurucuları ifşa etmemenizdir.
[olası kısıtlamalarla nasıl yazı yazılır] olası kopyası (http://stackoverflow.com/questions/7978191/how-to-make-a-type-with-restrictions) – ehird