2010-10-28 27 views
50

Có những tuyên bố rằng hệ thống kiểu của Scala là Turing hoàn tất. Câu hỏi của tôi là:Hệ thống kiểu trong Scala là Turing hoàn chỉnh. Bằng chứng? Thí dụ? Lợi ích?

  1. Có bằng chứng chính thức cho điều này không?

  2. Làm thế nào một phép tính đơn giản trông giống như trong hệ thống kiểu Scala?

  3. Đây có phải là bất kỳ lợi ích nào đối với Scala - ngôn ngữ không? Điều này có khiến Scala trở nên “mạnh mẽ hơn” theo cách nào đó so với các ngôn ngữ không có hệ thống kiểu Turing hoàn chỉnh không?

Tôi đoán điều này áp dụng cho các ngôn ngữ và hệ thống kiểu nói chung.

+4

Tôi muốn có hệ thống kiểu không phổ biến và trình biên dịch nhanh thay thế. – ziggystar

+0

@ziggystar những gì bạn sẽ đạt được trong tốc độ biên dịch bạn sẽ có khả năng bị mất trong dev và thời gian gỡ lỗi. – BAR

Trả lời

35

Có một bài đăng trên blog ở đâu đó với việc thực hiện loại cấp phép tích hợp bộ đệm SKI, được biết là Turing-complete.

Hệ thống kiểu Turing hoàn chỉnh về cơ bản có cùng lợi ích và nhược điểm mà ngôn ngữ Turing hoàn chỉnh có: bạn có thể làm bất cứ điều gì, nhưng bạn có thể chứng minh rất ít. Đặc biệt, bạn không thể chứng minh rằng bạn cuối cùng sẽ thực sự làm điều gì đó.

Một ví dụ về tính toán mức loại là bộ biến đổi bộ sưu tập kiểu bảo quản mới trong Scala 2.8. Trong Scala 2.8, các phương thức như map, filter và như vậy được đảm bảo trả về bộ sưu tập cùng loại mà chúng được gọi. Vì vậy, nếu bạn filter a Set[Int], bạn sẽ quay lại Set[Int] và nếu bạn map a List[String] bạn nhận lại List[Whatever the return type of the anonymous function is].

Bây giờ, như bạn thấy, map thực sự có thể chuyển đổi loại phần tử. Vì vậy, điều gì sẽ xảy ra nếu loại phần tử mới không thể được biểu diễn bằng loại bộ sưu tập gốc? Ví dụ: BitSet chỉ có thể chứa số nguyên cố định chiều rộng. Vì vậy, điều gì sẽ xảy ra nếu bạn có một số BitSet[Short] và bạn ánh xạ từng số tới biểu diễn chuỗi của nó?

someBitSet map { _.toString() } 

Kết quả sẽ là một BitSet[String], nhưng điều đó là không thể. Vì vậy, Scala chọn siêu kiểu có nguồn gốc xuất sắc nhất của BitSet, có thể giữ String, trong trường hợp này là Set[String].

Tất cả các tính toán này đang xảy ra trong suốt thời gian biên dịch , hay chính xác hơn trong loại kiểm tra thời gian, sử dụng chức năng loại cấp. Vì vậy, nó được đảm bảo tĩnh để được loại an toàn, mặc dù các loại được thực sự tính toán và do đó không được biết đến tại thời điểm thiết kế.

+14

Tôi cho rằng đây là bài đăng trên blog bạn đang tìm kiếm? http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/. Scala có vẻ như một ngôn ngữ gọn gàng khi tôi lần đầu tiên nhìn vào nó; rằng siêu lớp-suy luận là một tính năng * thực sự * tuyệt vời. –

+6

Câu trả lời xuất sắc, mặc dù các ví dụ về bộ sưu tập giảm một chút ngắn. Trong khi trình kiểm tra kiểu chắc chắn đang thực hiện một số phương pháp chẩn đoán thú vị để lấy kiểu thu thập kết quả tốt nhất vào thời gian biên dịch, nó không phải là một ví dụ tốt về tính toán mức loại vì hệ thống kiểu * chính nó * không thực sự làm bất kỳ công việc nào. Thật không may (hoặc có lẽ, may mắn thay), không có nhiều ví dụ về mã thực tế thực sự lập trình loại cấp thực tế, đơn giản bởi vì nó rất khó, khó khăn và không thể duy trì được. –

+0

Cảm ơn Jörg vì ví dụ tuyệt vời và Daniel để làm rõ. Bây giờ tôi sợ hỏi nếu kiểm tra loại là Turing Hoàn thành ... – Adrian

33

My blog post khi mã hóa phép tính SKI trong hệ thống kiểu Scala hiển thị đầy đủ tính năng Turing.

Đối với một số tính toán cấp kiểu đơn giản, cũng có một số ví dụ về cách mã hóa các số tự nhiên và bổ sung/multiplication.

Cuối cùng, có một tuyệt vời series of articles về lập trình cấp loại trên blog của Apocalisp.

+0

michid, có vẻ ấn tượng. Tôi hứa sẽ có một cái nhìn tốt hơn khi tôi lớn lên ... Đây có thể không phải là một bằng chứng FORMAL, nhưng nó có thể thuộc về danh sách này? http://en.wikipedia.org/wiki/Computer-assisted_proof#List_of_theorems_proved_with_the_help_of_computer_programs – Adrian

+2

@Adrian, bằng chứng chính thức duy nhất được biết đến về tính hoàn chỉnh của turing là khả năng thực hiện điều gì đó khác đang hoàn tất. Thông thường điều này có nghĩa là một máy turing phổ quát nhưng lý thuyết giữ ngay cả khi bạn sử dụng một cái gì đó khác được biết là turing hoàn chỉnh như tính toán SKI hoặc Perl hoặc Javascript. Vì vậy, tôi sẽ gửi rằng đây là một bằng chứng chính thức. – slebetman

+2

Cũng cần lưu ý rằng không có gì thực tế có thể thực hiện được thực sự turing hoàn thành vì nó là không thể có bộ nhớ vô hạn. Ngay cả khi bạn sử dụng hết tất cả các vật chất trong vũ trụ để xây dựng CPU/thông dịch viên của bạn thì nó vẫn chưa thực sự hoàn chỉnh. Những gì chúng tôi thực tế đề cập đến như turing hoàn thành là thực sự turing-hoàn-trong-giới hạn-of-có sẵn-bộ nhớ. – slebetman

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