2011-01-09 17 views
6

Tôi gặp một số câu trả lời (ở đây trong SO) nói rằng Haskell có nhiều "góc tối" trong hệ thống kiểu của nó, và cũng có một số lỗ lộn xộn. Ai đó có thể giải thích về điều này?Các vấn đề trong Haskell's Type-System

Cảm ơn trước

+4

Chăm sóc để đăng liên kết đến các câu trả lời đó? –

+1

well, http://stackoverflow.com/questions/3770774/what-language-to-learn-after-haskell và http://stackoverflow.com/questions/822752/should-i-learn-haskell-or- f-if-i-already-know-ocaml/823338 # 823338 – Ishihara

+0

Tôi đoán sự cần thiết cho 'zip2, zip3, zip4' v.v ... có phần nào có vấn đề? –

Trả lời

13

Tôi đoán tôi nên trả lời này, đặc biệt kể từ khi hai người cho đến nay đã hiểu sai những nhận xét của tôi ...

Về không chấm dứt, nhận xét trong câu hỏi là cường điệu nhẹ cho hiệu ứng ấn tượng, và gọi không chấm dứt ở mức giá trị. Đây là trong bối cảnh so sánh Haskell với các định lý lý thuyết, trong câu trả lời cho một người đã đề cập đến các thuộc tính chính xác được thực thi theo kiểu như một cái gì đó mà chúng đặc biệt đánh giá cao. Trong ý nghĩa đó, sự hiện diện của ⊥ nơi sinh sống của các loại trống là một "lỗ hổng", bởi vì nó thay đổi ý nghĩa của một kiểu như A -> B từ "cho A, tạo B" thành "cho A, hoặc tạo ra B hoặc treo chương trình "đó là, vì lý do rõ ràng, phần nào ít thỏa mãn từ một quan điểm chứng minh-chính xác.

Nó cũng hoàn toàn không liên quan đến hầu như tất cả các chương trình hàng ngày và không tệ hơn bất kỳ ngôn ngữ đa năng nào khác bởi vì, tất nhiên, khả năng không chấm dứt là cần thiết cho Turing-đầy đủ.

Tôi không gặp bất kỳ sự cố nào với UndecidableInstances. Trên thực tế, nó làm tôi khó chịu hơn ⊥ ở mức giá trị vì nó chỉ làm hỏng GHC khi biên dịch chứ không phải chương trình đã hoàn thành. Tuy nhiên, OverlappingInstances là một vấn đề khác và quảng cáo đặc biệt của các phần mở rộng GHC để cung cấp một số ít những thứ tự nhiên nhất sẽ yêu cầu các loại phụ thuộc chắc chắn đủ điều kiện là "lộn xộn".

Nhưng hãy nhớ rằng hầu hết những điều tôi phàn nàn về Haskell chỉ là vấn đề vì nền tảng rất vững chắc. Hầu hết các loại hệ thống trong các ngôn ngữ gõ tĩnh khác thậm chí không đủ mạch lạc để được gọi là "sai" so với các công cụ dọn dẹp mà tôi gọi là "lộn xộn" là một lĩnh vực nghiên cứu đang hoạt động và đang diễn ra.

+0

Cảm ơn bạn đã làm rõ. Tôi đã ngạc nhiên trước những gì tôi nghĩ bạn đang tranh luận, nhưng tôi đã không đi và cẩn thận cố gắng đọc cụm từ được trích dẫn trong ngữ cảnh. – sclv

+0

Trên một mức độ nitpicking, tôi sẽ phân biệt giữa, bằng cách này, "treo chương trình" và không tổ chức, bằng cách này. Hãy nhớ khẩu hiệu của chúng tôi - các chương trình được đánh máy tốt cũng không sai! – sclv

+3

@sclv: Trong thực tế, vâng, tuyệt đối. Trong bối cảnh chính xác được thực thi kiểu, phân biệt giữa các loại khác nhau của ⊥ là sắp xếp lại các ghế xếp trên tàu Titanic. Có lẽ tôi nên nói điều gì đó như "... hoặc đánh giá ⊥" thay vào đó, nhưng ... giấy phép thơ ca, tôi đoán vậy? –

1

Vì vậy, bạn đang đề cập đến Camccann nói "hệ thống kiểu Haskell là đầy đủ của lỗ, do nontermination và thỏa hiệp lộn xộn khác"? Tôi nghĩ anh ấy đang nói về tiện ích mở rộng UndecidableInstances và có thể là một số khác. Sau đó, bạn chỉ có thể giả định, nói rằng "Hệ thống kiểu Haskell là tham vọng và mạnh mẽ, nhưng nó liên tục được cải thiện, có nghĩa là có một số mâu thuẫn là kết quả của lịch sử.". Tôi chắc rằng anh ta có một cái gì đó trong tâm trí nhưng sẽ cho anh ta làm rõ khi anh ta nhìn thấy câu hỏi này.

+0

Tôi nghi ngờ rằng Norman Ramsey đang nói về sự tương tác không hoàn toàn hiểu giữa các phần mở rộng GHC thử nghiệm khác nhau, đặc biệt là những thứ như GADT, chồng chéo, gia đình loại và những thứ tôi đã thấy ai đó (McBride, có lẽ?) như một "hodgepodge khủng khiếp". –

6

Hệ thống kiểu của Haskell không có vấn đề gì hoặc các lỗ lộn xộn. Haskell 98 có thể hoàn toàn được suy ra kiểu. Nó sở hữu cái được gọi là thuộc tính "kiểu chính", có nghĩa là bất kỳ biểu thức nào có ít nhất một kiểu chung nhất. Tuy nhiên, có một loạt các biểu thức tốt và hữu ích và hợp lệ nhưng không gõ dưới Haskell 98. Quan trọng nhất trong số này là các loại xếp hạng cao hơn. forall a b. (a -> b) -> a -> b là một ví dụ (không thú vị) của loại xếp hạng, có nghĩa là forall chỉ ở bên ngoài. forall b. -> (forall a. a -> a) -> b -> b là một ví dụ về một loại vô dụng nhưng có thể không phải là thứ hạng, và không thể được thể hiện trong Haskell98. Các loại xếp hạng cao hơn là một trong nhiều thứ phá vỡ thuộc tính loại chính.

Khi người ta thêm ngày càng nhiều phần mở rộng cho hệ thống Haskell98 cơ bản, bắt đầu có sự cân bằng giữa khả năng viết các loại thực sự mạnh mẽ thể hiện cả các loại đa hình khác nhau và các loại ràng buộc khác nhau và khả năng có nhiều mã có thể hoàn toàn kiểu suy ra. Ở các cạnh của những gì có thể, các loại có thể lộn xộn và phức tạp, và đôi khi bạn có thể chạy vào những thứ có vẻ như chúng hoạt động nhưng không. Nhưng vào thời điểm đó, bạn thường làm những gì được gọi là "lập trình cấp loại", nơi mà rất nhiều logic ứng dụng của bạn đã được nhúng vào các loại, và thông qua một sự kết hợp các thủ thuật typeclass mà bạn đã kết nối trình biên dịch vào, về cơ bản, chạy các loại như một chương trình tại thời gian biên dịch.

Tôi không đồng ý, bằng cách này, với xác nhận của camccann rằng không có khả năng là một sự thỏa hiệp lộn xộn trong trình kiểm tra loại. Tôi nghĩ rằng đó là một tính năng hoàn toàn hữu ích, thực tế là điều kiện tiên quyết cho việc chuyển đổi hoàn toàn ở cấp độ loại, và bạn chỉ mạo hiểm nếu bạn yêu cầu trình biên dịch bắt đầu cho phép nhiều thứ tinh ranh.

+0

Nói về nitpicking - không chính xác liên quan đến câu hỏi, nhưng có vẻ thực sự kỳ lạ khi mọi người tận dụng tên người dùng của tôi như thế, vì đây là tên đệm ban đầu ++ đầu tiên của họ. Tôi có lẽ nên thay đổi tên hiển thị của tôi ở đây thành một cái gì đó hợp lý hơn [như tôi sử dụng ở nơi khác] (http://lambda-the-ultimate.org/user/7309). –

+0

@camccann - viết hoa cố định :-) – sclv

+0

Tôi không nghĩ rằng nó đáng giá thêm một câu trả lời hoàn toàn mới chỉ cho điều này, nhưng có lẽ bạn cũng có thể đề cập đến hạn chế monomorphism? Tôi thấy đây là một biến chứng khá xấu xí của hệ thống kiểu có xu hướng cắn rất nhiều người mới bắt đầu. –

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