Chúng ta đều đã thấy số nguyên, dấu phẩy động, chuỗi và kiểu thập phân không thường xuyên. Một số loại lạ hoặc độc đáo hoặc hữu ích nhất mà bạn đã gặp, hữu ích hay không?
Chúng ta đều đã thấy số nguyên, dấu phẩy động, chuỗi và kiểu thập phân không thường xuyên. Một số loại lạ hoặc độc đáo hoặc hữu ích nhất mà bạn đã gặp, hữu ích hay không?
Câu trả lời:
Tôi sẽ nói ngắn gọn:
Maybe a
trong Haskell.
Với cấu trúc đơn giản này, ngôn ngữ giải quyết vấn đề về sự cố hoặc NullPointerException
, nó gọn gàng vượt qua "Một triệu sai lầm" của Tony Hoare :)
Thành thật mà nói, một sự hiện diện tùy chọn được kiểm tra tại thời gian biên dịch? Thật là mơ mộng ...
Option
cái tên đó. Tại sao không Optional
! Có thể là do tôi không phải là người bản ngữ, nhưng Option
không truyền đạt ý nghĩa "tùy chọn" cho tôi.
Maybe
tên thật dễ thương: "Bạn có gì?" "Có thể là một Int". Tuy nhiên, một chút thực sự gọn gàng là nó vừa là functor vừa là một đơn nguyên, nói một cách đơn giản, có nghĩa là bạn được truyền bá null miễn phí. Bạn không bao giờ cần đặt kiểm tra null bên trong các chức năng hoặc ở giữa mã của bạn; bạn chỉ cần kiểm tra nó ở cuối mã của bạn, nếu có.
Maybe
đơn nguyên cho Ruby: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
Tôi rất thích void *
. Nó có lẽ là một triệu chứng của một cái gì đó thiếu sót sâu sắc trong tôi.
void *
và Pascal / Delphi có Pointer
.
Lua có một bảng tích hợp ấn tượng nhất. Nó đã tích hợp sẵn trong Hashtable và một véc tơ, và với việc sử dụng metatables có thể là cơ sở nền tảng cho lập trình hướng đối tượng trong một ngôn ngữ thủ tục.
Mỗi chỉ mục của một bảng có thể nhận bất kỳ cấu trúc ngôn ngữ cơ bản nào (số, boolean, chuỗi, hàm -yes, các hàm là các loại trên lua - và bảng).
Tôi ngạc nhiên không ai đã đề cập đến Monads hoặc Đại số Datatypes.
Lisp có hai loại thú vị: t
và nil
. Điều thú vị về họ là mọi thứ đều là a t
và không có gì là a nil
.
nil
một t
?
SNOBOL: mẫu (về cơ bản là cây phân tích cú pháp LL (1), nếu tôi nhớ chính xác).
Fortran có các khối chung; đó là một trong những loại dữ liệu ít phổ biến nhất trong các ngôn ngữ hiện đại, hay nói đúng hơn là một cách bất thường để chia sẻ dữ liệu một cách hiệu quả.
Fortran 95 có các loại khoảng thời gian và tích hợp arithologists.
Danh sách sẽ không đầy đủ nếu không có các loại đơn âm được tìm thấy trong Haskell. Để hiểu họ bạn cần một chút nỗ lực.
Tôi cho rằng nó thực sự chỉ lạ khi đến từ lập trình trên kiến trúc cổ điển, nhưng chắc chắn một trong những loại khó nhất đối với tôi lúc đầu là thanh ghi lượng tử , xuất hiện trong QCL .
PL / SQL cho phép bạn khai báo các biến loại my_table.some_column%type
... Tôi thấy rằng khá hữu ích.
Và C # cho phép bạn khai báo các đối tượng là nullable hay không, mặc dù tôi không chắc rằng nó được tính là một loại.
cursor%rowtype
thậm chí còn buồn cười hơn: đó là loại bản ghi được hình thành động phản ánh cột nào mà truy vấn của con trỏ trả về.
Tôi đã có một điểm yếu trong trái tim về các kiểu dữ liệu của Euphoria khi tôi còn trẻ
Nó được cấu trúc như vậy:
Object
-> Atom
-> Sequence
Trình tự = Một chuỗi các đối tượng
-- examples of atoms:
0
98.6
-1e6
-- examples of sequences:
{2, 3, 5, 7, 11, 13, 17, 19}
{1, 2, {3, 3, 3}, 4, {5, {6}}}
{{"jon", "smith"}, 52389, 97.25}
{} -- the 0-element sequence
Xem: Hướng dẫn tham khảo
Lưu ý: "jon" thực sự là một cách viết tay ngắn để viết chuỗi các giá trị ASCII. Ví dụ "ABCDEFG"
giống như{65, 66, 67, 68, 69, 70, 71}
Felix có các loại tổng ẩn danh. Loại được viết như sau:
typedef il = int + long;
như nó sẽ là trong lý thuyết. Các giá trị là xấu:
case 0 of il (1)
case 1 of il (2L)
ngoại trừ có lẽ cho một đơn vị tổng như 3 = 1 + 1 + 1
case 0 of 3
case 1 of 3
không may sử dụng số đếm gốc bằng 0 cho "khả năng tương thích C". Các khoản tiền ẩn danh là cần thiết cho các loại đại số được gõ theo cấu trúc, ví dụ:
(1 + T * li) as li
là một danh sách (liên kết đơn) của T. Tất cả các ngôn ngữ khác mà tôi biết về các khoản tiền được gõ theo danh nghĩa bắt buộc, trong đó cả chính loại và các hàm tạo phải được đặt tên.
Tốc ký 3 được sử dụng ở trên là dễ thương, sau đây là trong thư viện:
typedef void = 0;
typedef unit = 1;
typedef bool = 2;
và ký hiệu này:
T ^ 3
là một mảng có độ dài tĩnh 3 .. 3 không phải là số nguyên mà là tổng của 3 đơn vị. Thật đáng tiếc + không liên quan :)
q / kdb + có các bảng dựng sẵn. Vì nó là ngôn ngữ lập trình và cơ sở dữ liệu hướng theo cột trong một, nên không cần LINQ hoặc ORM.
Ví dụ: có thể tạo một bảng như thế này (bài tập bị phân tán :
thay vì =
như trong hầu hết các ngôn ngữ):
people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)
Bây giờ tôi có thể nhìn vào bảng của mình:
q)show people
name age GPA
--------------
Joe 17 3.5
Amy 15 3.8
Sarah 18 3.33
Và tôi có thể truy vấn nó:
q)select from people where GPA>3.4
name age GPA
------------
Joe 17 3.5
Amy 15 3.8
Tôi thấy công đoàn trong C ++ là 'kỳ quặc' khi lần đầu tiên tôi nghe về họ. Tôi vẫn chưa đạt được một kịch bản mà chúng là lựa chọn rõ ràng để thực hiện.
Tôi vẫn đang cố gắng che giấu những gì một hàm đa tham số trở thành trong F # và các ngôn ngữ chức năng khác. Về cơ bản int f (Foo, Bar) trở thành func f (Foo)
Đó là hai hàm tham số lấy một Foo và một Bar và trả về một int thực sự là một hàm tham số lấy một Foo và trả về một hàm tham số lấy một thanh và trả về một int. Nhưng bằng cách nào đó bạn có thể gọi nó với hai tham số nếu bạn muốn. Tôi đã viết một bài về nó ở đây
f(Foo, Bar)
giống như hàm f(Foo)
trả về một hàm khác f'(Bar)
trả về giá trị những gì f(Foo, Bar)
sẽ trả về. Đó là, nếu bạn sửa đối số 'Foo', nhưng không phải là 'Bar', bạn có một chức năng không phụ thuộc vào 'Foo' nhưng vẫn phụ thuộc vào đối số 'Bar'. Đây là điển hình cho các ngôn ngữ chức năng; nó được gọi là "cà ri".
Chúng là những vật thể cực kỳ mạnh mẽ nhưng nhỏ gọn.
Các ngôn ngữ có chúng được xây dựng có khả năng tuyệt vời để thao tác văn bản (cho phép không nghe thấy phân tích từ mà chúng không tốt).
Một số ít ngôn ngữ trong họ chức năng có một lớp các loại được gọi là Unity. Đặc điểm nổi bật của các loại Unity là chúng không chứa thông tin, chúng là các loại bit không. Một loại thống nhất (trong một số biến thể) cũng là giá trị duy nhất của nó hoặc (trong hầu hết các loại khác) chỉ có một giá trị (bản thân nó không phải là một loại).
Đây là những hữu ích, mặc dù, vì chúng là loại phân biệt. Vì bạn không thể chuyển đổi hoàn toàn từ loại thống nhất này sang loại khác, bạn có thể đặt kiểm tra loại tĩnh để hoạt động theo cách rất hiệu quả và biểu cảm.
Unity cũng là cách mà hầu hết các ngôn ngữ như vậy mô tả Enums, bằng cách cho phép một loại mới là bất kỳ nhóm nào được xác định của các loại khác hoặc để mô tả các loại có thể , các giá trị có thể là giá trị của một loại điển hình (giả sử là số nguyên) hoặc có một giá trị đại diện cho giá trị không.
Một số ngôn ngữ không sử dụng sự phong phú của các loại thống nhất do người dùng xác định vẫn có sự thống nhất trong chúng, ở dạng này hay dạng khác. Ví dụ, Python có ít nhất ba loại đoàn kết, NoneType
, NotImplementedType
, và EllipsisType
. Thật thú vị khi cả hai đầu tiên đều có nghĩa là "Không có giá trị", nhưng cái thứ ba được sử dụng trong các giá trị phức tạp (cụ thể là biểu thức lát) để thể hiện các trường hợp đặc biệt thú vị.
Các ví dụ thú vị khác về sự thống nhất bao gồm NULL
trong sql và undefined
javascript, nhưng không có void
trong C hoặc C ++. void
thất bại Mặc dù nó mô tả một giá trị không có thông tin, nhưng không có giá trị thực tế nào có thể thuộc loại void
.
symbol
Kiểu của Ruby hơi khác thường. Nó thực chất là một chuỗi thực hiện mô hình singleton. Hoặc một cái gì đó. Cho đến nay, tôi đã tìm thấy cách sử dụng tốt nhất cho các biểu tượng là trong trạng thái theo dõi và chuyển tên hàm.
LỚN. Về cơ bản các loại chỉ có hai dữ liệu cơ bản, chuỗi và số, nhưng bạn phải xác định chính xác làm thế nào họ đang đặt ra trong bộ nhớ, ví dụ PIC S9(5)V99 COMP-3
.
S
= đã ký, 9(5)
= 5 chữ số, V
= dấu thập phân ẩn, 99
= 2 chữ số nữa, COMP-3
= BCD + ký hiệu nybble.
Clipper có 'Code Blocks', tương tự như các phương thức ẩn danh. Chúng có thể được thông qua và đánh giá khi cần thiết, thường là một hình thức gọi lại. Bạn thường sử dụng chúng cho những việc như thực hiện các phép tính nhanh khi trình bày các bảng dữ liệu.
VHDL có các loại vật lý. Một nghĩa đen của loại đó bao gồm cả một giá trị và một đơn vị. Bạn có thể xác định tiểu đơn vị là tốt. Ví dụ, một loại vật lý được xác định trước là time
:
type time is range <machine dependant> to <machine dependant>
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
Ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
Cùng với quá tải toán tử, bạn có thể định nghĩa những điều rất thú vị.
Clojure rất thú vị bởi vì nó có một khái niệm siêu "trừu tượng" bao trùm ngôn ngữ. Ví dụ:
Ở một mức độ nào đó, sự trừu tượng đưa " nguyên tắc trách nhiệm duy nhất " lên cực điểm. Tùy thuộc vào bạn để soạn chúng để có được chức năng mà bạn muốn, nhưng bạn có thể cực kỳ linh hoạt về cách bạn dán chúng lại với nhau.
Ví dụ, nếu bạn muốn một hệ thống OOP dựa trên lớp có tính kế thừa, bạn có thể xây dựng một trong những trừu tượng cốt lõi này một cách tương đối nhanh chóng.
Trong thực tế, bản thân các tóm tắt được thiết kế theo cách có thể thực hiện nhiều triển khai, ví dụ như thông qua các giao diện cụ thể như clojure.lang.ISeq cho các chuỗi hoặc clojure.lang.IFn cho các hàm bậc cao hơn.
Có một video thú vị về chủ đề này: Nghệ thuật trừu tượng
Googles Go có loại "Kênh" khá độc đáo.