Một recent question dẫn tôi tự hỏi làm thế nào để chuyển đổi mộtLàm thế nào tôi có thể đẩy đa hình thành một cấu trúc dữ liệu?
forall f . Functor f => [LensLike f s t a b]
thành một
[ReifiedLens s t a b]
Có một cách dễ dàng để làm điều đó thật chậm, bởi chỉ mục vào danh sách với !!
, nhưng nó khá khó tin không hiệu quả. Nó cảm thấy như có nên đủ tham số để kéo một thủ thuật tương tự như một được sử dụng trong reflection
, nhưng tôi dường như không thể tìm ra bất cứ điều gì. Có thể thực hiện điều này một cách hiệu quả không?
Tôi không nghĩ rằng điều này thậm chí có thể xảy ra. Chúng ta phải đi (hoạt động) từ 'Functor f -> [LensLike f s t a b]' thành '[Functor f -> LensLike f s t a b]'. Chúng ta cần truyền vào một 'Functor f' để lấy ra một danh sách để bắt đầu, và không có một cái nào xung quanh. –
@ AndrásKovács Có lẽ chúng ta có thể sử dụng tham số tham số để thuyết phục bản thân rằng các hàm của kiểu 'Functor f -> [LensLike f s t a b]' phải chọn độ dài của danh sách kết quả mà không kiểm tra đối số 'Functor f' một cách có ý nghĩa. Sau đó, thật dễ dàng để có được phần còn lại của con đường từ đó. (Tất nhiên yêu cầu này rõ ràng là không đúng với các chức năng của kiểu 'Functor F -> [LensLike F s t a b]' đối với một số 'F' cụ thể.) –
@ AndrásKovacs, đó là nỗi sợ của tôi. Chúng ta cần một số loại từ điển "superfunctor" mà chúng ta có thể vượt qua trong đó kỳ diệu có thể đưa vào danh tính của bất kỳ từ điển 'Functor' nào khác. – dfeuer