2015-10-12 14 views
8

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?

+2

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. –

+2

@ 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ể.) –

+0

@ 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

Trả lời

5

Testing ra ý tưởng của tôi trong các ý kiến, bạn có thể trên thực tế viết này trực tiếp bằng cách đi qua ALens:

convert :: (forall f. Functor f => [LensLike f s t a b]) -> [ReifiedLens s t a b] 
convert ls = [Lens (cloneLens l) | l <- ls] 

ALens được dựa trên Pretext functor:

type ALens s t a b = LensLike (Pretext (->) a b) s t a b 

newtype Pretext p a b t = Pretext { runPretext :: forall f. Functor f => p a (f b) -> f t } 

Điều này cho phép sử dụng một duy nhất Functor để đại diện cho tất cả chúng, ít nhất là để sử dụng ống kính.

Tôi vẫn tự hỏi liệu có phương pháp nào hoạt động bình thường và không chỉ cho ống kính.

+0

Tôi vẫn thấy bối cảnh 'Pretext'. Khi được áp dụng cho '(->)', tôi có thể xem nó như một ống kính được áp dụng một phần, nhưng tiện ích và tính tổng quát của nó vẫn gây nhầm lẫn cho tôi. – dfeuer

Các vấn đề liên quan