2013-08-05 28 views
13

Khi bạn tạo một loại đồng nghĩa với type, ghc/ghci sẽ sử dụng nó thay vì kiểu gốc bất cứ khi nào nó được sử dụng một cách rõ ràng, nhưng sẽ không bao giờ cố gắng làm việc ngược từ loại được suy ra đến một từ đồng nghĩa phù hợp. Lấy từ đồng nghĩa "trừu tượng" nhất cho một loại sẽ khá tiện dụng để tìm hiểu các ứng dụng và thư viện phức tạp, định nghĩa các từ đồng nghĩa cho các ngăn xếp đơn lẻ và có thể là các từ đồng nghĩa của các từ đồng nghĩa.Có cách nào để giải quyết các từ đồng nghĩa loại trong haskell không?

Có ai từng viết một đoạn mã như vậy không? Tôi tưởng tượng nó sẽ trở lại và nó cũng sẽ tạo ra một số ứng cử viên giả mạo (ví dụ nếu hai loại là bí danh của String, thì cả hai sẽ là ứng cử viên bất cứ khi nào chuỗi phải được giải quyết), nhưng nó có thể hữu ích trong một số trường hợp nhất định.

+0

Tôi đã đùa giỡn với ý tưởng chính xác, vì điều này thực sự hữu ích cho 'ống' và 'thấu kính'. Lý tưởng nhất là bạn sẽ chỉ định một số loại pragma trình biên dịch hoạt động như một quy tắc, phù hợp với một mẫu theo kiểu được phỏng đoán và viết lại nó vào từ đồng nghĩa loại tương đương (với một số loại ưu tiên nếu có nhiều kết quả trùng khớp). –

+1

Tôi được nhắc về một bài đăng trên blog mà tôi đã đọc một vài ngày trước đã đề cập đến "chữ ký của Chthulu": http://joelt.io/entries/yesod-in-production – BruceBerry

+0

nó có vẻ giống như một cái gì đó tốt cho một gsoc hoặc tương tự – jozefg

Trả lời

1

Không phải là câu trả lời, nhưng là một câu hỏi. Loại từ đồng nghĩa thường được sử dụng để đặt tên các loại trong "mã mức cao", nhưng ngay sau khi bạn chuyển các loại đó vào mã mức/trợ giúp thấp hơn (được định nghĩa theo các loại cụ thể hơn), hệ thống nên theo dõi như thế nào từ đồng nghĩa áp dụng? xem xét như sau:

type Title = String 
type Name = String 

capitalise :: String -> String 

my_title = "Mayor" :: Title 

shouted_title = capitalise my_title :: ??? 

như thế nào typechecker biết rằng String đi sâu vào chức năng heleper capitalise là khái niệm cùng loại như String ra khỏi capitalise? Trong sự hiện diện của nhiều loại bí danh, trình kiểm tra loại nên chọn loại nào để sử dụng?

0

Trình biên dịch Frege, IDE và REPL cố gắng làm điều này cho các ứng dụng kiểu (ngoại trừ ứng dụng (->)) khi chúng được yêu cầu hiển thị loại "đẹp" và nó hoạt động trong hầu hết các trường hợp. Dưới đây là một ví dụ online session đoạn:

frege> type Flubber = (Int, Double) 
frege> x = (42, 3.0) 
frege> :t x  
Flubber 
frege> y = [x,x,x,x] 
frege> :t y 
[Flubber] 

Vì vậy, về nguyên tắc, nó cũng nên làm việc trong Haskell (có lẽ modulo mở rộng nhất định trong các loại hệ thống liên quan đến Haskell 2010). Tuy nhiên, hãy nhớ rằng - như @ Thomas đã chỉ ra trong câu trả lời của anh ta - có thể có nhiều cách để loại bỏ bí danh loại và do đó đầu ra có thể thực sự gây hiểu lầm.

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