Evet. Buna "sözlük aktarma stili" denir. Bazen bazı zor şeyler yaptığımda, bir daktilo yazıp bir sözlüğe dönüştürmem gerekiyor, çünkü sözlük geçişi daha güçlü 1 , ancak genellikle oldukça hantal, kavramsal olarak basit kod oldukça karmaşık görünüyor. Tipik kelimeleri taklit etmek için bazen Haskell olmayan dillerde sözlük aktarma stilini kullanıyorum (ancak bunun genellikle göründüğü kadar büyük bir fikir olmadığını öğrendim).
Tabii ki, ifade gücünde bir fark olduğunda, bir değiş tokuş vardır. DPS kullanılarak yazılmışsa, belirli bir API'yı daha fazla şekilde kullanabilirsiniz, ancak yapamıyorsanız API daha fazla bilgi alır. Bunun pratikte Data.Set
ortaya çıkmasının bir yolu , Ord
tip başına sadece bir sözlük olması gerçeğine dayanmaktadır . Set
Saklar unsurları göre sıralanır Ord
tek sözlükle kümesi oluşturmak ve ardından farklı birini kullanarak bir öğesi yerleştirdim, DPS ile mümkün olacağı gibi, sen kırılabilir ve eğer Set
'nin değişmez ve kilitlenmesine neden. Bu teklik sorunu, hayali bir varoluş kullanılarak azaltılabilirsözlüğü işaretlemek için yazın, ancak yine de API'daki biraz can sıkıcı karmaşıklığın pahasına. Bu aynı zamanda Typeable
API'da hemen hemen aynı şekilde görünür.
Teklik biti çok sık ortaya çıkmaz. Hangi tipler büyük sizin için kod yazmaktır. Örneğin,
catProcs :: (i -> Maybe String) -> (i -> Maybe String) -> (i -> Maybe String)
catProcs f g = f <> g
girdi alan ve çıktı veren iki "işlemci" alır ve bunları birleştirerek düzleştirerek Nothing
DPS'de şöyle bir şey yazılması gerekir:
catProcs f g = (<>) (funcSemi (maybeSemi listSemi)) f g
Zaten tür imzasında zaten yazmış olsak da, onu tekrar kullandığımız türü hecelemek zorunda kaldık ve bu bile gereksizdi çünkü derleyici zaten tüm türleri biliyor. Belirli Semigroup
bir türde bir yapı oluşturmanın tek bir yolu olduğundan , derleyici bunu sizin için yapabilir. Bu, bir çok parametrik örneği tanımlamaya ve türlerinizin yapısını sizin için hesaplamak için, birleştiricilerde olduğu gibi kullanmaya başladığınızda "bileşik faiz" tipi bir etkiye sahiptir Data.Functor.*
ve bu, deriving via
temelde tüm Sizin için yazılmış tipinizin "standart" cebirsel yapısı.
Ve beni, bilgileri daktilo kontrolüne ve çıkarsamaya besleyen MPTC'lere ve fundeps'e bile başlama. Hiç böyle bir şeyi DPS'ye dönüştürmeyi denemedim - bunun birçok tür eşitlik kanıtı geçirmeyi gerektirdiğinden şüpheleniyorum - ama her durumda beynim için rahat olacağımdan çok daha fazla iş olacağından eminim ile.
-
1 U nless kullandığınız reflection
iktidarda eşdeğer hale bu durumda - fakat reflection
aynı zamanda kullanım külfetli olabilir.