data WineStock : Fruit -> Type where
CanonicalWine : WineStock Grape
CiderIsWineToo : WineStock Apple
Banana
, Orange
, Lemon
ve diğerleri için tutmaz ki, bu reklam
data Fruit = Apple | Banana | Grape | Orange | Lemon | {- many others -}
ve bu türler üzerinde bir yüklemi var diyelim. Bu
WineStock
,
Fruit
; (Biz bu tür bir değeri/kanıt oluşturmak çünkü:
CanonicalWine
)
WineStock Grape
doğru olduğu
WineStock Apple
yanı sıra, ancak bu tür herhangi bir değer/deliller yaşadığı değildir çünkü
WineStock Banana
,
yanlış olup. Sonra
, nasıl etkin bir şekilde Not (WineStock Banana)
, Not (WineStock Lemon)
, vs kullanımı hakkında gidebilir? Grape
ve Apple
yanında her Fruit
yapıcısı için ben impossible
s, tam yardım ama bir yerde, WineStock
üzerinde bir vaka bölünmüş kadar kodlamak için olamaz gibi görünüyor:
instance Uninhabited (WineStock Banana) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
instance Uninhabited (WineStock Lemon) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
instance Uninhabited (WineStock Orange) where
uninhabited CanonicalWine impossible
uninhabited CiderIsWineToo impossible
Not olun:
- kodu yinelenen,
- Yükleme tanımı büyüdüğünde, daha fazla kurucu kazandığında LoC patlayacaktır. Sadece
Fruit
tanımında birçok tatlı alternatif olduğunu varsayarak,Not (Sweet Lemon)
kanıtı hayal edin.
Yani, bu şekilde oldukça, neredeyse pratik tatmin edici görünmemektedir.
Daha şık yaklaşımlar var mı?
Eski Haskell deyimlerinin çoğu, bağımlı yazılan sistemlerde değişmez. “Yasadışı devletleri temsil edilemez hale getirin” türünde de tutuyor: Ben bu imkansız türleri bile yapabilmeniz gerektiğini düşünmüyorum. Muhtemelen bu örneği şarabın yapabildiği bir tür meyveye (kabaca benzer bir şekilde) yapılandırabilirdim WineFruit = Üzüm | Apple' ve diğer meyveler' verileri Fruit = WineFruit WineFruit | Muz | Portakal | Limon ' –
@BenjaminHodgson, bu yaklaşım' PieFruit ',' SaladFruit ',' WeaponFruit ', vb eklemek istediğinizde parçalara ayrılmaya başlar. – dfeuer
Eğer idris içinde olduğunuz göz önüne alındığında, neden' WineStock 'için bir veri türü tanımlıyorsunuz ? 'IsWineStock' değerini bir değer seviyesi işlevi olarak tanımlayamıyor ve uygun olduğu durumlarda ispatlarda kullanamıyor musunuz? – sclv