Các loại thú vị hoặc độc đáo trong ngôn ngữ lập trình? [đóng cửa]


20

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?


Xin chào user10008, chào mừng bạn đến với Lập trình viên. Bạn đã kiểm tra Câu hỏi thường gặp của chúng tôi ? Bạn nghĩ câu hỏi nào trong sáu hướng dẫn chủ quan ?

4
Có ai muốn viết bài cho Lisp không?
Đánh dấu C

Tôi nghĩ rằng nó có thể là một lừa bịp, nhưng chỉ vì câu trả lời của tôi sẽ là một người bị mắc mưu, vì vậy tôi sẽ đăng một liên kết và có thể bạn sẽ tìm thấy một số câu trả lời tốt: programmers.stackexchange.com/questions/724/...
Peter Turner

@Mark: Tôi đã thử, nhưng các loại có lẽ là một trong những điều ít thú vị nhất về Lisp.
Larry Coleman

@LarryC Tôi nghĩ rằng đây là câu hỏi hoàn hảo cho Lisp vì việc sử dụng danh sách toàn diện ! Các danh sách tạo thành cây cú pháp và điều này cho phép bạn viết các hàm thực hiện những điều tuyệt vời vào mã của bạn, tôi thu thập. Tôi đang học vợt (trước đây là PLT Scheme ). Lisp là ngôn ngữ lập trình duy nhất tôi thực sự có động lực và hứng thú học hỏi.
Đánh dấu C

Câu trả lời:


18

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 ...


1
Hoặc Tùy chọn như được gọi trong nhiều ngôn ngữ lập trình khác.
Jonas

@Jonas: Tôi phải thừa nhận tôi không thích Optioncá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 Optionkhông truyền đạt ý nghĩa "tùy chọn" cho tôi.
Matthieu M.

Cái Maybetê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ó.
Tikhon Jelvis


15

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.


2
Vâng. Tôi sợ đó chính xác là những gì nó được. :) Ồ, +1 cho "thú vị" thay vì "độc nhất". Objective-C rõ ràng có void *và Pascal / Delphi có Pointer.
Frank Shearar

haha nhiều hơn một loại không, nhưng bạn không thể tranh luận rằng nó không mạnh mẽ
user10008

15
Tôi chỉ thích sự bi quan cố hữu mà nó thể hiện: 'Bạn có thể thấy điều đó ở đó không?' 'Vâng, nó là gì?', 'Không có ý tưởng.'
biziclop

Tôi luôn nghĩ thật buồn cười khi bạn không thể tuyên bố một khoảng trống nhưng bạn có thể lấy địa chỉ của nó. Dường như với tôi rằng với struct s {int A; khoảng trống B; int C; } rằng địa chỉ của B phải là địa chỉ của vết nứt giữa A và C. Nhưng không, không được phép.
Andy Canfield

Đó là lý do tại sao trong "con trỏ" pascal được sử dụng để biểu thị một con trỏ chung và không nhầm lẫn với "thủ tục".
umlcat

14

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).


Lưu ý cách Javascript được xây dựng theo cách rất giống nhau và Python được xây dựng trên cùng một nền tảng, như có lẽ là Ruby.
9000

Tôi nghĩ điều này cũng có thể có trong Perl và PHP, vâng?
Thất vọngWithFormsDesigner

Có một sự khác biệt giữa các bảng trong lua và các thùng chứa băm trong các ngôn ngữ khác. Có một sự khác biệt thực hiện tinh tế trong cách lua phân phối các giá trị băm làm cho các bảng của nó hoạt động theo những cách gần như kỳ diệu. Tôi chủ yếu lập trình bằng python và đôi khi thấy rằng tôi đang sử dụng các giả định không giữ được, dựa trên những kỳ vọng của tôi về cách thức hoạt động của các bảng trong lua. Một ví dụ cụ thể của phép thuật này là số nguyên băm cho chính họ + 1. Điều này có nghĩa là các khóa số nguyên được đóng gói dày đặc và +0.0 và -0.0 có cùng hàm băm (chúng bằng nhau)
SingleNegationElimination

9

Tôi ngạc nhiên không ai đã đề cập đến Monads hoặc Đại số Datatypes.


Có thể cho chúng tôi xem các ví dụ :)
nawfal

8

Lisp có hai loại thú vị: tnil. Điều thú vị về họ là mọi thứ đều là a tvà không có gì là a nil.


Bạn nghiêm túc chứ? Tôi không biết điều đó.
Đánh dấu C

nilmột t?
Jon Harrop

6

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).


6

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.


Ah, DB DB UniData / UniVerse cũng có các khối chung trong ngôn ngữ nội bộ của họ (UniBasic).
Dan McGrath

Là một khối chung một khối mã được sử dụng bởi các phần khác nhau của chương trình?
Đánh dấu C

1
@MarkC IIRC dữ liệu cơ bản toàn cầu của nó, nhưng mỗi chức năng truy cập phải nói rõ ràng rằng nó sẽ ở trên cùng
jk.

5

Delphi có các bộ ( xem thêm ), mà tôi không tin là được thực hiện theo cách tương tự trong các ngôn ngữ khác.

Điều này làm cho việc lưu trữ các thuộc tính đa biến trong cơ sở dữ liệu dễ dàng: D


4

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 .


3

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.


4
Nhưng cursor%rowtypethậ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ề.
9000

.NET "Nullable" thực sự là một loại (chung).
Konamiman

3

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
  • Nguyên tử = Một giá trị số duy nhất
  • 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}


7
Cảm giác này giống như LISP ...
Thất vọngWithFormsDesigner

Các loại dữ liệu thực tế là bit duy nhất.
Dan McGrath

1
@FrustratedWithForms Tương tự, tôi nghĩ, "Này, anh ta nói, 'Nguyên tử'! Nó trông giống như (a) Lisp nhưng với các vạch chia không cần thiết .: P
Mark C

3

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 :)


2

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

2

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.


3
Liên hiệp đến từ C. Một ví dụ điển hình là cấu trúc zval trong php.
Martin Wickman

2
Tôi đã sử dụng chúng trong trình giả lập Z80, để dễ dàng truy cập vào các thanh ghi 16 bit dưới dạng toàn bộ các thanh ghi (HL, BC) và như các thanh ghi 8 bit (H, L, B và C). Điều này phản ánh cách chúng được sử dụng trong Z80 asm. Cũng trong "các biến thể", một lớp có thể chứa giá trị của các loại khác nhau (ví dụ int / float) - không chắc tại sao tôi không sử dụng các lớp con, nhưng nó có ý nghĩa vào thời điểm đó :)
ggambett

@ggambett: Tôi đã thực hiện chính xác như vậy cho các chương trình Z80 của mình! Chỉ có điều tôi cũng đã thêm một bitfield để truy cập các cờ riêng lẻ trong thanh ghi F.
Konamiman

2

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


8
Thay vào đó, một hàm 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".
9000

2

Biểu thức chính quy:

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).


2
Hoàn toàn có thể phân tích nhiều ngữ pháp đơn giản với regexes. Chẳng hạn, việc phân tích một tệp ini với mức logic tối thiểu trên một tập các biểu thức chính là tương đối tầm thường. Sai lầm mà nhiều người mắc phải là cố gắng phân tích các ngữ pháp rất phức tạp với nó (ví dụ: XML / HTML).
Matthew Scharley


@Mark C: Đứng đầu là câu trả lời là (với kỷ lục phá vỡ 4320 phiếu bầu). Bạn không thể
Martin York

Vâng, đó là cho sự hài hước. Nó xuất hiện trong tâm trí khi tôi đọc bình luận của Matthew.
Đánh dấu C

2

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 NULLtrong sql và undefinedjavascript, nhưng không có voidtrong C hoặc C ++. voidthấ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.


Tôi nghĩ bạn có nghĩa là "loại đơn vị".
Jason Baker

2

symbolKiể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.


Cũng như các khóa cho bản đồ để so sánh khóa O (1).
Jeremy Heiler

Chà, nó không thực sự khác thường. Ruby được thừa hưởng nó từ Smalltalk, được thừa hưởng nó từ Lisp. Scala cũng có nó, tôi nghĩ vậy. Trên thực tế, hầu hết mọi thực thi ngôn ngữ (trình biên dịch hoặc trình thông dịch) đều có bảng ký hiệu bên trong, Lisp, Smalltalk và Ruby chỉ hiển thị nó cho lập trình viên.
Jörg W Mittag

1

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.


Tôi có thể đánh bại điều đó. BCPL có một loại dữ liệu - từ; thấy en.wikipedia.org/wiki/BCPL
Stephen C

Có nhiều loại số khác nhau (COMP, COMP-1, COMP-2, COMP-3).
David Thornley

Điều đó nghe thật khủng khiếp. Bạn có thể giải thích những gì những chi tiết có nghĩa?
Đánh dấu C

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.
dan04

1

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.


0

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ị.


0

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ụ:

  • Bộ sưu tập
  • Trình tự (lười và không lười)
  • Chức năng bậc cao
  • Đa sắc
  • Giao thức
  • Tài liệu tham khảo được quản lý
  • Macro
  • nhiều người khác .....

Ở 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


0

Nếu bạn muốn một ngôn ngữ với một loại duy nhất thì hãy đến BCPL . Ngôn ngữ này chỉ có một loại dữ liệu, từ, là một số bit cố định để thực hiện ngôn ngữ.


0

Googles Go có loại "Kênh" khá độc đáo.


1
Các kênh không phải là duy nhất. Nhiều ngôn ngữ có chúng. Felix đã có chúng 10 năm trước khi Google tồn tại :) Ocaml đã có chúng 10 năm trước khi Felix tồn tại.
Yttrill

Và có ít nhất một ngôn ngữ khác có các kênh trước khi Ocaml tồn tại. Vẫn là một trong những loại ít có sẵn nhất trong các ngôn ngữ lập trình.
Brainlag
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.