Hãy nói rằng tôi cóBất kỳ thủ thuật nào để loại bỏ bản mẫu khi xây dựng bằng chứng về vị từ vô lý trên enums?
data Fruit = Apple | Banana | Grape | Orange | Lemon | {- many others -}
và một vị vào loại đó,
data WineStock : Fruit -> Type where
CanonicalWine : WineStock Grape
CiderIsWineToo : WineStock Apple
mà không giữ cho Banana
, Orange
, Lemon
và những người khác.
Nó can be said rằng điều này xác định WineStock
làm vị từ trên Fruit
; WineStock Grape
là đúng (vì chúng ta có thể xây dựng một giá trị/bằng chứng về loại rằng: CanonicalWine
) cũng như WineStock Apple
, nhưng WineStock Banana
là sai, vì loại đó là không nơi sinh sống của bất kỳ giá trị/chứng minh.
Sau đó, làm thế nào tôi có thể đi về việc sử dụng một cách hiệu quả Not (WineStock Banana)
, Not (WineStock Lemon)
, vv? Dường như đối với từng Fruit
constructor ngoài Grape
và Apple
, tôi không thể giúp đỡ, nhưng phải mã lên một sự chia rẽ trường hợp trên WineStock
, ở đâu đó, đầy impossible
s:
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
Lưu ý rằng:
- mã lặp lại,
- LoC sẽ phát nổ khi định nghĩa vị ngữ phát triển, thu được nhiều hàm tạo hơn. Chỉ cần tưởng tượng bằng chứng
Not (Sweet Lemon)
, giả sử có nhiều lựa chọn thay thế ngọt theo định nghĩaFruit
.
Vì vậy, cách này dường như không thỏa mãn, gần như không thực tế.
Có cách tiếp cận trang nhã hơn không?
Nhiều thành ngữ Haskell cũ không thay đổi trong các hệ thống được đánh máy phụ thuộc. "Làm cho các quốc gia bất hợp pháp không thể đại diện được" giữ ở cấp độ loại quá: Tôi không nghĩ rằng bạn thậm chí có thể xây dựng những loại không thể đó. Tôi có lẽ sẽ cấu trúc ví dụ này như (một cái gì đó gần giống như) một loại trái cây có thể làm cho rượu vang 'dữ liệu WineFruit = nho | Apple 'và các loại trái cây khác' dữ liệu Trái cây = Rượu vangTháp Rượu vang | Chuối | Orange | Lemon' –
@BenjaminHodgson, cách tiếp cận đó bắt đầu sụp đổ khi bạn muốn thêm 'PieFruit',' SaladFruit', 'WeaponFruit', v.v. – dfeuer
Cho rằng bạn đang ở trong idris, tại sao bạn định nghĩa một kiểu dữ liệu cho' WineStock' ? Bạn có thể không chỉ định nghĩa 'isWineStock' như một hàm mức giá trị và sử dụng nó trong các chứng minh khi thích hợp? – sclv