tôi chỉ có thể làm các loại cấp bậc n trong Idris 0.9.12 theo một cách khá vụng về:Làm rank-n định lượng trong Idris
tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b)
tupleId f (a, b) = (f _ a, f _ b)
tôi cần những dấu gạch dưới bất cứ nơi nào có một ứng dụng loại, vì Idris ném phân tích cú pháp lỗi khi tôi cố gắng thực hiện các đối số kiểu (lồng nhau) ẩn:
tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile
Một vấn đề lớn hơn có thể là tôi không thể làm hạn chế lớp ở các loại hạng cao hơn. Tôi không thể dịch các chức năng sau đây để Haskell Idris:
appShow :: Show a => (forall a. Show a => a -> String) -> a -> String
appShow show x = show x
này cũng ngăn cản tôi từ việc sử dụng các chức năng Idris as type đồng nghĩa với nhiều loại như Lens
, đó là Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
trong Haskell.
Bất kỳ cách nào để khắc phục hoặc phá vỡ các vấn đề trên?
Có trong danh sách TODO của tôi - thông thường mọi thứ sẽ chuyển lên danh sách TODO nếu ai đó hỏi về họ, vì vậy chỉ cần hỏi đây là một cách để giúp khắc phục :). Đáng ngạc nhiên, thực sự không có nhiều nhu cầu về điều này, mặc dù rõ ràng nó sẽ tốt đẹp. Có một số khó khăn trong việc nhận được các đối số ngầm định ngay, vì vậy chúng tôi đã thực hiện một cách tiếp cận khá đơn giản ngay bây giờ. Loại lớp là lớp đầu tiên, vì vậy cũng có một cách vụng về để thực hiện các ràng buộc của lớp - coi chúng là các đối số hàm bình thường và sử dụng '% instance' để tìm cá thể một cách rõ ràng. –
@EdwinBrady cảm ơn, tôi chấp nhận điều này như một câu trả lời (hoặc tôi sẽ làm như vậy là một câu trả lời). –
Nó chưa cảm thấy như một câu trả lời đúng ... Tôi sẽ sớm trả lời bạn! –