Vì vậy, tôi đang làm việc trên một thử nghiệm thú vị trong ý nghĩa theo ngữ cảnh và tôi đang chạy vào một bức tường. Tôi đang cố gắng để xác định một loại dữ liệu có thể là một nguyên thủy hoặc một chức năng mà chuyển đổi từ một nhà xây dựng khác.Ràng buộc Constructors trong một chữ ký
data WeaponPart =
WInt Int |
WHash (Map.Map String Int) |
WNull |
WTrans (WeaponPart -> WeaponPart)
instance Show WeaponPart where
show (WInt x) = "WInt " ++ (show x)
show (WHash x) = "WHash " ++ (show x)
show (WTrans _) = "WTrans"
show WNull = "WNull"
cold :: WeaponPart -> WeaponPart
cold (WInt x) = WHash (Map.singleton "frost" x)
cold (WHash x) = WHash $ Map.insertWith (+) "frost" 5 x
cold (WTrans x) = cold $ x (WInt 5)
cold (WNull) = cold $ (WInt 5)
ofTheAbyss :: WeaponPart -> WeaponPart
ofTheAbyss (WTrans x) = x (WTrans x)
Những vấn đề là chữ ký cho ofTheAbyss
cho phép bất kỳ WeaponPart như một cuộc tranh cãi, trong khi tôi chỉ muốn cho phép lập luận WTrans-constructred. Bạn có thể thấy tôi đã chỉ viết một mẫu phù hợp cho trường hợp đó.
Tôi đã thử làm việc với GADT nhưng tôi sợ rằng đó là một lỗ thỏ. Không bao giờ có thể khiến họ làm những gì tôi muốn. Có ai có bất kỳ ý tưởng làm thế nào tôi có thể thực thi chỉ đối số WTrans vào ofTheAbyss? Hay tôi hoàn toàn thiếu một cái gì đó.
Cảm ơn.
nhất, Erik
Đây là một câu trả lời tuyệt vời. Tôi có nghĩa là cách tôi đang sử dụng GADT là một lỗ thỏ nhưng một người nào đó, rõ ràng, khôn ngoan hơn nhiều có thể hiểu được nó. Và ánh sáng của tôi, ai đó đã làm! Tuyệt vời. Tôi không bao giờ có thể có được làm thế nào để có nó cả hai cách, viz để có WeaponPart Compound và Some WeaponPart. Ngoài ra, đây là một ví dụ tuyệt vời về các hệ thống kiểu nhúng được lưu trong ngày. –
Một điều cuối cùng, tôi nhận được nó làm việc rất hào hứng với tôi. Điều duy nhất tôi phải thay đổi là tôi phải lấy phần PolyKinds và tạo ra 'data Sort = Base | Hợp chất 'chỉ vào' dữ liệu Base' và 'dat Compound'. Nó tiếp tục phàn nàn, đúng là Base không phải là một nhà xây dựng kiểu. Có điều gì tôi đang thiếu với PolyKinds? Rất có thể. –
Ahh, tôi sẽ để lại sai lầm của tôi cho người khác để học bằng cách: Tôi cần các pragma DataKinds, không phải là pragma PolyKinds. Tất cả các phần mở rộng mới lạ mắt này. –