2012-05-25 30 views
9

Có thể tắt hoặc làm việc xung quanh hệ thống kiểu trong Haskell không? Có những tình huống mà thuận tiện để có mọi thứ không được phân loại như trong Forth và BCPL hoặc được định kiểu đơn như trong Mathematica. Tôi đang suy nghĩ dọc theo các dòng tuyên bố tất cả mọi thứ như cùng một loại hoặc vô hiệu hóa loại kiểm tra hoàn toàn.Haskell không có loại

Chỉnh sửa: Theo nguyên tắc SO, đây là một câu hỏi kỹ thuật hẹp, không phải là yêu cầu thảo luận về giá trị tương đối của các phương pháp lập trình khác nhau. Để thuật lại câu hỏi, "Haskell có thể được sử dụng theo cách sao cho tránh được xung đột loại là hoàn toàn trách nhiệm của lập trình viên?"

+9

[no] (http://dmwit.com/bacteria/grumpy.jpg) –

+6

Thuận tiện, có thể. Nhưng lưu ý rằng bất kỳ giải pháp nào bạn sử dụng sẽ không phải là Haskell thành ngữ về văn hóa, luôn được đánh máy mạnh mẽ. Tôi đề nghị bạn để lại "sự bất tiện" đằng sau và tìm hiểu nó theo cách thức văn hóa - một khi bạn đã dành thời gian với nó, tất cả sẽ rơi vào vị trí và bạn sẽ tự hỏi tại sao bạn nghĩ bạn cần vô hiệu hóa trình kiểm tra kiểu. – luqui

+3

+1 để sử dụng "quy chuẩn văn hóa" trong việc trả lời câu hỏi lập trình. –

Trả lời

7

Ngoài ra, hãy xem Data.Dynamic cho phép bạn có các giá trị được nhập động trong các phần của mã mà không vô hiệu hóa kiểm tra loại trong suốt.

+0

Tất nhiên người ta vẫn sẽ gặp lỗi khi cố gắng thao tác dữ liệu có giá trị không có ý nghĩa trong bất kỳ bối cảnh nào. ví dụ. cố gắng thêm một chuỗi vào một int. Tôi không nghĩ rằng mô-đun này thay đổi điều đó. – Wes

+0

Tôi sẽ thử cái này. – user287424

8

GHC 7.6 (không được công bố chưa) có một tính năng tương tự, -fdefer-type-errors:

http://hackage.haskell.org/trac/ghc/wiki/DeferErrorsToRuntime

Nó sẽ hoãn tất cả các lỗi loại cho đến khi thời gian chạy. Nó không thực sự lộn xộn nhưng nó cho phép gần như tự do.

+5

Như Pubby lưu ý, đây là * không * giống như nhập động. Cụ thể, sự khác biệt là: giả sử '-fdefer-type-errors' và xem xét hàm' addOne :: a -> a' được định nghĩa bởi 'addOne x = x + 1'.Điều này rõ ràng có một lỗi kiểu, và gọi nó là 'addOne" x "' sẽ lỗi một cách thích hợp. Tuy nhiên, 'addOne (1 :: Int)' sẽ (như tôi hiểu nó) * cũng * lỗi: mặc dù mã sẽ hoạt động do tai nạn trong trường hợp đó, * nó vẫn sai *, và bạn sẽ gặp lỗi bạn * sẽ * đã nhận được tại thời gian biên dịch. –

+2

Nó không cung cấp sự tự do từ hệ thống kiểu. Nó không có nghĩa là để tắt hệ thống kiểu, chỉ cần trì hoãn nó nếu lỗi trong câu hỏi không liên quan đến 'main' tại thời gian biên dịch. – rotskoff

7

Ngay cả với fdefer-type-errors người ta sẽ không tránh hệ thống kiểu. Nó cũng không thực sự cho phép độc lập kiểu. Điểm của lá cờ là cho phép mã có lỗi loại biên dịch, miễn là các lỗi không được gọi bởi hàm Main. Đặc biệt, bất kỳ mã nào có lỗi kiểu, khi thực sự được gọi bởi một trình thông dịch Haskell, sẽ vẫn thất bại.

Trong khi triển vọng của các chức năng không được định kiểu trong Haskell có thể hấp dẫn, điều đáng chú ý là hệ thống kiểu thực sự là trọng tâm của ngôn ngữ. Mã này chứng tỏ chức năng của nó trong biên dịch, và độ cứng của hệ thống kiểu ngăn một số lượng lớn các lỗi.

Có lẽ nếu bạn đưa ra một ví dụ cụ thể về sự cố bạn đang gặp phải, cộng đồng có thể giải quyết vấn đề đó. Interconverting giữa các loại số là một cái gì đó mà tôi đã hỏi về trước, và có một số thủ thuật tốt.

+0

Đối với những người quan tâm, hai lĩnh vực ứng dụng chính mà điều này có liên quan là lập trình thăm dò (ví dụ nghiên cứu AI) và toán học biểu tượng. Xem cuộc thảo luận giữa những người Lispers đã thử Haskell nhưng đã quay lại vì hệ thống kiểu. Xem thảo luận về đại số máy tính về lý do tại sao hệ thống Axiom được đánh máy mạnh không đạt được sự chấp nhận giữa các nhà toán học. – user287424

+0

Lưu ý: Từ ngữ trên "Điểm của lá cờ là cho phép mã có lỗi loại biên dịch, miễn là các lỗi không xuất hiện trong Main. Cụ thể, bất kỳ mã nào có lỗi loại, khi được gọi lúc chạy, sẽ vẫn Thất bại." là mơ hồ và có khả năng gây hiểu nhầm. Tức là, "xuất hiện trong' Main' "và" được gọi là lúc chạy "nghĩa là gì? Xem [giấy] (http://dreixel.net/research/pdf/epdtecp_draft.pdf) để có trực giác tốt hơn. Ví dụ. 'fst (True, 'a' && False)' đánh giá thành 'True', sau khi được dịch sang' fst (Đúng, lỗi "Lỗi loại: Không thể khớp Char với Bool") '. – ntc2

+0

Mặt khác, hãy xem 'addOne' [bên dưới] (http://stackoverflow.com/questions/10747703/haskell-without-types#comment13967400_10747745) để biết ví dụ nơi bạn có thể không gặp lỗi nhưng nhận được lỗi. Vì vậy, một bản tóm tắt tốt hơn có thể là: loại lỗi được bản địa hóa (được đẩy lên lá của cây biểu thức) càng nhiều càng tốt (heuristically), và sau đó thay thế bằng các cuộc gọi đến 'error'. Đánh giá lười biếng của Haskell có nghĩa là các cuộc gọi lỗi này không kích hoạt nếu giá trị (đầu) của các biểu thức của chúng không cần thiết trong thời gian chạy. – ntc2

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