2016-05-16 8 views
26

Dường như cho đến những năm gần đây, theo cách thông thường để vượt qua một loại thêm một chức năng là để làm một cái gì đó giống nhưAi đã phát minh ra proxy và khi nào?

f (undefined :: T) 

Kiselyov và Shan thậm chí sử dụng phương pháp này trong tác phẩm cổ điển của họ trên phản ánh đẳng cấp dựa trên cảm hứng gói reflection. Họ tha thứ cho sự xấu xí rõ ràng bằng cách lưu ý rằng giá trị không có thật là không bao giờ được kiểm tra. Và một hóa thân chỉ hơi xấu xí xuất hiện trong Data.Bits.finiteBitSize, có một giá trị nó bỏ qua để có được loại của nó.

Sau đó, ai đó đã tìm ra thành ngữ proxy và mọi thứ đã thay đổi. Bây giờ, chúng tôi luôn thấy sự hài lòng hơn nữa

f (Proxy :: Proxy T) 

(trong mã chuẩn — Ứng dụng loại GHC là một câu chuyện khác).

Ai đã tìm ra? Điều này đầu tiên xuất hiện trong mã một nơi nào đó, hoặc một bài báo?

+5

Lần đầu tiên tôi thấy Proxy trong gói [tagged] (http://hackage.haskell.org/package/tagged-0.1.0/docs/Data-Tagged.html) của Edward, fwiw. Nó không phải là 0,0 nhưng chỉ bằng 0,1. –

+0

Câu hỏi thú vị.Trên các tin tức khác, tôi chỉ thấy nhận xét về thẻ _history_ "KHÔNG sử dụng thẻ này cho các câu hỏi về lịch sử của một khái niệm hoặc tính năng lập trình; những câu hỏi đó không có chủ đề". Đôi khi các chính sách SO rất đáng ngạc nhiên. (Và có, bình luận này cũng là một chút OT ở đây). – chi

Trả lời

18

A câu hỏi tuyệt vời. TypeLevelReasoning, đề xuất GHC sớm từ tháng 4 năm 2013, tham chiếu đến libraries chủ đề "Proxy, new Typeable, and type-level equality" (áp phích gốc Richard Eisenberg, động lực đằng sau nhiều tác phẩm Haskell phụ thuộc gần đây). Chủ đề đó tham chiếu đến một chủ đề khác libraries"Proxy and new-typeable" (áp phích gốc Shachaf Ben-Kiki), được bắt đầu để phản hồi một bản vá từ chi nhánh new-typeable. Rất khó để tìm một bản ghi các tên chi nhánh cũ và cam kết mà chúng chỉ ra, nhưng commit 3d53407 by José Pedro Magalhães có vẻ là phiên bản bị đè bẹp của nhánh đó. Quả thực nó dường như là đích cam kết đầu tiên trong GHC để giới thiệu loại data Proxy t = Proxy. Eisenberg sau đó sẽ chuyển loại đó thành Data.Proxy trong commit 01aa22b vào tháng 2 năm 2013. Thiết kế cuối cùng của Proxy dường như là tổng hợp tập hợp các ý tưởng từ nhiều người. Tuy nhiên, chúng tôi có thể tìm tài liệu tham khảo học thuật cho Proxy trong tác phẩm của Magalhães, chẳng hạn như bản trình bày "The right Kind of Generic Programming" (tháng 10 năm 2012) và bài đăng trên blog của mình "Coming soon in GHC HEAD: poly-kinded Typeable" (tháng 11 năm 2012). Chúng tôi có thể có thể phân bổ sự bao gồm của Proxy trong cơ sở cho anh ta.

Tuy nhiên, ý tưởng về một loại Proxy dường như già hơn rất nhiều:

Ở đây, các tìm kiếm trên Google của tôi sẽ bị khô. Tôi dường như không thể tìm thấy tiền đề cho bài báo năm 2005 đó.

Coda: đề xuất của Shachaf trong chủ đề đó, định lượng phổ loại proxy bằng cách sử dụng forall proxy a. proxy a (thư viện cơ sở vẫn sử dụng cho đến ngày nay) thay vì forall a. Proxy a là điều thú vị, vì điều đó và các email khác trong chuỗi đề xuất tại đó một điểm có thể là nhiều trường hợp của Proxy nổi xung quanh hệ sinh thái Haskell. Như đã đề cập trong các ý kiến, Kmett's tagged library had it back in June 2010.

+4

* Nghiên cứu tuyệt vời *! – dfeuer

+2

Proxy định lượng phổ biến rất hữu ích khi người dùng thư viện có thể đã sở hữu một 'f a' đối với một số' f'. Ví dụ 'datatypeName :: Datatype d => td (f :: * -> *) a -> [Char]' [từ Generics] (https://hackage.haskell.org/package/base/docs/GHC- Generics.html # t: Kiểu dữ liệu) là một kiểu «datatype d => proxy d -> [Char]' rất tiện lợi cho người đang nắm giữ một nút meta 'M1 D dfp' của một biểu diễn chung. – Cirdec

+1

Thật thú vị, Lammel và Jones mô tả kỹ thuật của họ như là tiêu chuẩn. Cũng thú vị, nó chắc chắn là * không * kỹ thuật proxy hiện đại. 'Proxy a' của họ không có người ở, vì những lý do mơ hồ không thực sự hợp lý. – dfeuer

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