Có ngôn ngữ lập trình nào cho phép bạn thiết lập số học trên các loại không?


9

Vì tò mò, có ngôn ngữ nào cho phép bạn đặt số học trên các loại để tạo loại mới không? Cái gì đó như:

interface A {
  void a();
  void b();
}

interface B {
  void b();
  void c();
}

interface C = A & B; // has b()
interface D = A | B; // has a(), b() and c()
interface E = (A & B) ^ B; // has c()

Tôi biết rằng trong một số ngôn ngữ, những ý tưởng này có thể được thể hiện (nghĩa là Java List<Comparable & Serializable>dành cho sự kết hợp các giao diện) nhưng tôi chưa bao giờ nghe thấy một ngôn ngữ hỗ trợ số học kiểu. Cảm ơn!


7
Làm thế nào một cơ chế như vậy sẽ hữu ích?
Robert Harvey

4
Một mẫu tôi đã thấy rất nhiều là một giao diện mở rộng hai giao diện khác và không thêm bất cứ thứ gì (nghĩa là CanWriteAndCompare extends Serializable, Comparable {}) và tôi đã nghĩ cách để khái quát hóa giao diện này.
Haldean Brown

2
Ngoài ra, tôi đã gặp một trường hợp ngày hôm nay khi tôi có phương pháp có thể lấy một Ahoặc một B, với hai triển khai trông giống hệt nhau. Trong phương thức tôi đang gọi một phương thức đa hình có thể lấy một Ahoặc a B, vì vậy các triển khai là như nhau, nhưng vì tôi phải thực hiện hai loại khác nhau nên tôi cần hai triển khai. Điều này sẽ dễ dàng hơn nếu tôi có thể làm myMethod(A | B aOrB).
Haldean Brown


1
Orhoạt động có thể được mô phỏng bởi nhiều kế thừa.
người dùng

Câu trả lời:


4

Tangent ( 0,3 spec ) sử dụng một cái gì đó giống với điều này. (từ chối trách nhiệm: đây là dự án nghiên cứu nhỏ của riêng tôi)

Hiện tại withhoạt động như một kế thừa mô hình nhà điều hành công đoàn, mặc dù chủ nghĩa thực dụng đã làm cho nó không giao hoán. Một khi bạn giới thiệu việc triển khai các phương thức, một liên kết chặt chẽ của các phương thức có cùng tên thường không phải là điều bạn muốn và không thể thực hiện được.

intersectđược hỗ trợ rằng các kiểu suy luận kiểu cho một cái gì đó giống như foo(T,T)các tham số khác nhau.

Bổ sung rất thú vị, nhưng dẫn đến các loại một phần có vẻ không hữu ích và / hoặc rắc rối để bao gồm chính xác - vì vậy không được bao gồm.

Tôi biết có một vài ngôn ngữ nghiên cứu khác mà tôi đã chạy qua có một thứ tương tự, nhưng không thể nhớ chúng vào lúc này. Vấn đề chính là những thứ không thực sự hữu ích nếu không gõ cấu trúc, bản thân nó không phổ biến lắm. Một cách khác là bạn cần một số loại (loại loại) để lưu trữ loại được xây dựng, hoặc nếu không, nó chỉ là viết tắt cho một thứ không đặc biệt thành ngữ nếu không có khả năng đó. Và đó là ít phổ biến hơn nhiều so với gõ cấu trúc.

Nó thiên vị, và nó không nhiều, nhưng nó có.


5

Đúng, Ceylon là một ngôn ngữ với các loại kết hợp và giao cắt ad hoc, như được mô tả trong chương này từ chuyến tham quan Ceylon:

http://ceylon-lang.org/documentation/1.0/tour/types/

Thật đáng kinh ngạc số lượng thành ngữ tuyệt vời mà bạn nhận được từ này. Đây là một ví dụ thú vị mà tôi đã viết blog gần đây . Và đây là một bài thuyết trình ngắn trong đó tôi nhanh chóng đưa ra một số thành ngữ đơn giản .

Thậm chí tốt hơn, các loại kết hợp / giao cắt là "liên kết bị thiếu" làm cho suy luận đối số loại chung thực sự hoạt động ngay trong Ceylon, trái ngược với các ngôn ngữ khác kết hợp giữa đa hình phụ và đa hình tham số.

Lưu ý rằng có những hạn chế đối với loại "số học loại" này, như bạn đã mô tả. Ví dụ: bạn không thể có một toán tử bổ sung được thiết lập ở cấp độ loại, ít nhất là không mà không giới thiệu tính không ổn định.

HTH


3

Scala hỗ trợ nó một phần (giao điểm chứ không phải liên hiệp) và bất kỳ ngôn ngữ nào có phân nhóm cấu trúc (tôi nghĩ OCaml là một ví dụ) hoặc một hệ thống loại đủ mạnh để mô phỏng rằng (Haskell là một ngôn ngữ cổ điển) sẽ có đầy đủ "kiểu tập hợp "Các khả năng, ít nhất là trong đoạn hệ thống loại của nó chấp nhận những thứ như vậy (có liên quan khi nó được mô phỏng theo ala HList / OOHaskell).

Vì tôi không biết rõ về OCaml, tôi sẽ đưa ra một phần ví dụ của bạn hoạt động trong Scala:

trait A {
  def a(): Unit
  def b(): Unit
}

abstract class B { // just to prove it works with both traits and classes
  def b(): Unit
  def c(): Unit
}

type C = A with B
type D = { def b(): Unit } // not an exact translation, because unions aren't directly available
// type `E` is unrepresentable

Một phiên bản cho Haskell sẽ phụ thuộc vào hệ thống bản ghi mà bạn đang sử dụng và có thể sẽ hơi khó hiểu, bởi vì nó sẽ được mô phỏng thay vì được hỗ trợ nguyên bản.

Theo như tôi biết, Ceylon có cả loại giao cắt kết hợp được xây dựng thành ngôn ngữ với toàn bộ sức mạnh, do đó bạn có thể mã hóa một "xor" cấp độ theo các loại.


1

Java hỗ trợ các giao điểm của các loại giao diện trong một số bối cảnh, mặc dù điều đó không quá xa như tôi có thể nói cho phép tạo ra các biến của các loại giao cắt. Các loại giao lộ có thể đi vào hoạt động, ví dụ, khi sử dụng ? :toán tử. Nếu toán hạng thứ hai và thứ ba cho toán tử đó là các giao diện không liên quan kế thừa từ các bộ giao diện chồng chéo, kết quả của toán tử sẽ là tập hợp các giao diện chung cho cả hai.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.