Цікаві чи унікальні типи в мовах програмування? [зачинено]


20

Усі ми бачили ціле число, плаваючу крапку, рядок та випадковий десятковий тип. Які є найбільш дивні чи унікальні чи корисні типи, з якими ви стикалися, корисні чи ні?


Привіт user10008, ласкаво просимо до Programmers.SE! Ви перевірили наш FAQ ? Яке із шести суб'єктивних вказівок , на вашу думку, відповідає вашому питанню?

4
Хтось хотів би написати запис для Lisp?
Марк C

Я думав, що це могло бути дупом, але тільки тому, що моя відповідь була б дуп, тому я опублікую посилання і, можливо, ви знайдете якісь хороші відповіді: programer.stackexchange.com/questions/724/…
Пітер Тернер

@Mark: Я намагався, але типи, мабуть, одна з найменш цікавих речей про Lisp.
Ларрі Коулман

@LarryC Я подумав, що це ідеальне питання для Lisp через всепроникне використання списків ! Списки утворюють синтаксичне дерево, і це дозволяє вам писати функції, які роблять дивовижні речі у ваш код, я збираю. Я зараз вивчаю Ракетку (раніше PLT-схему ). Lisp - єдина мова програмування, яку я справді мотивував і зацікавлений вивчити.
Марк C

Відповіді:


18

Я короткий:

Maybe a

в Хаскелл.

За допомогою цієї простої конструкції мова вирішує проблему збоїв, або NullPointerExceptionвона акуратно переходить в бік "Помилки в мільйон" Тоні Хоара :)

Чесно кажучи, необов'язкове присутність перевіряється під час компіляції? Це мрійливо ...


1
Або варіант, як його називають у багатьох інших мовах програмування.
Йонас

@Jonas: Я мушу визнати, що мені це Optionім'я не подобається . Чому ні Optional! Це може бути тому, що я не є носієм мови, але Optionне передає для мене "необов'язкового" значення.
Маттьє М.

MaybeІм'я мило: «Що у вас є?» "Можливо, Інт". Однак дійсно акуратний біт полягає в тому, що він є і функтором, і монадою, що, звичайно кажучи, означає, що ви отримуєте нульове поширення безкоштовно. Ніколи не потрібно ставити нульові перевірки всередині функцій або в середині коду; вам потрібно коли-небудь перевірити це в самому кінці коду, якщо він взагалі є.
Тихон Єлвіс


15

Мене багаторічно люблять void *. Це, мабуть, симптом чогось глибоко недосконалого в мені.


2
Так. Боюся, що саме так і є. :) О, +1 для "цікавого", а не "унікального". Очевидно, що у Objective-C є void *і Pascal / Delphi Pointer.
Френк Ширар

ха-ха, більше не типу, але ви не можете стверджувати, що він не є потужним
user10008

15
Мені просто подобається притаманний песимізм, який він виражає: "Ви можете бачити те, що там?" "Так, що це?", "Не маю уявлення".
biziclop

Я завжди думав, що це смішно, що ти не можеш оголосити недійсним, але ти можеш прийняти його адресу. Мені здається, що з struct s {int A; пустота В; int C; } що адреса B повинна бути адресою тріщини між A і C. Але ні, не дозволено.
Енді Кенфілд

Ось чому в паскалі "покажчик" використовується для позначення родового вказівника, а не плутати з "процедурою".
umlcat

14

У Луа є вбудований стіл, який найбільше вражає. Він має вбудований хешбел та вектор, і із застосуванням метатабелів може бути основоположною базою для об'єктно-орієнтованого програмування на процедурній мові.

Кожен індекс таблиці може приймати будь-яку з основних мовних структур (число, булева, рядок, функція -ее, функції - це типи на lua - та таблиці).


Зауважте, як Javascript побудований дуже схожим чином, а Python побудований на тій самій основі, як, ймовірно, і Ruby.
9000

Я думаю, що це також можливо в Perl та PHP, так?
FrustratedWithFormsDesigner

Існує різниця між таблицями в lua та хеш-контейнерами іншими мовами. Існує тонка різниця в застосуванні в способі розподілу хеш-значень Lua, завдяки чому його таблиці працюють майже магічно. Я здебільшого програмую на python, і при нагоді виявляю, що використовую припущення, які не дотримуються, виходячи з моїх очікувань того, як таблиці працюють в луа. Конкретним прикладом цієї магії є те, що цілі числа мають хеш для себе + 1. Це означає, що цілі клавіші запаковані щільно, а +0.0 і -0.0 мають однаковий хеш (вони рівні)
SingleNegationElimination




6

Фортран має загальні блоки; це один з найменш поширених типів даних у сучасних мовах або, скоріше, незвичний спосіб ефективного обміну даними.

Фортран 95 має типи інтервалів та вбудовану інтервальну арифметику.

Список не був би повним без монадичних типів, знайдених у Haskell. Щоб їх зрозуміти, потрібно докласти трохи зусиль.


Так, у UniData / UniVerse БД також мають загальні блоки у своїй внутрішній мові (UniBasic).
Ден МакГрат

Чи є загальним блоком блок коду, який використовується різними частинами програми?
Марк C

1
@MarkC IIRC в основному глобальні дані, але кожна функція, до якої має бути доступ, повинна прямо сказати, що вона збирається вгорі
jk.


4

Я гадаю, що це дійсно дивно, що виходить з програмування на класичній архітектурі, але, безумовно, одним із найважчих для мене типів спочатку був квантовий регістр , який відображається в QCL .


3

PL / SQL дозволяє оголошувати змінні типу my_table.some_column%type... Я вважаю це досить чортовим корисним.

І C # дозволяє вам оголосити об'єкти як нульові чи ні, хоча я не впевнений, що вважається типом.


4
Але cursor%rowtypeце навіть смішніше: це динамічно сформований тип запису, який відображає, у яких стовпцях повертається запит курсора.
9000

.NET "Nullable" насправді є самим (загальним) типом.
Конаміман

3

У мене було м'яке пляма в моєму серці для Euphoria типів даних «s , коли я був молодший ,

Вона структурована таким чином:

Object
-> Atom
-> Sequence
  • Atom = Одиничне числове значення
  • Послідовність = Послідовність об'єктів

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

    Дивіться: Посібник з посилання

Примітка: "jon" - це фактично короткий спосіб запису послідовності значень ASCII. Наприклад "ABCDEFG", те саме, що{65, 66, 67, 68, 69, 70, 71}


7
Це відчуває подібність до LISP ...
FrustratedWithFormsDesigner

Фактичні типи даних - єдиний біт.
Ден МакГрат

1
@FrustratedWithForms Те саме, я подумав: "Гей, він сказав:" Атом "! Це схоже на (а) Lisp, але із зайвими роздільниками.: P
Марк C

3

Фелікс має анонімні типи сум. Тип записується так:

typedef il = int + long;

як це було б в теорії. Значення некрасиві:

case 0 of il (1)
case 1 of il (2L)

за винятком, можливо, одиниці суми, такої як 3 = 1 + 1 + 1

case 0 of 3
case 1 of 3 

який, на жаль, використовує нульовий підрахунок для "сумісності C". Анонімні суми необхідні для структурно типових алгебраїчних типів, наприклад:

(1 + T * li) as li

- це (окремо пов'язаний) список Т. Всі інші мови, які я знаю, потрібні номінально введені суми, де і самому типу, і конструкторам потрібно давати назви.

Використовувана вище стенограма 3 мила, в бібліотеці:

typedef void = 0;
typedef unit = 1;
typedef bool = 2;

і це позначення:

 T ^ 3

є масивом статичної довжини 3 .. 3 не є цілим числом, а сумою 3 одиниць. Шкода + не асоціативно :)


2

q / kdb + має вбудовані таблиці. Оскільки це мова програмування та база даних, орієнтована на стовпці в одній, немає необхідності в LINQ або ORM.

Наприклад, можна створити таку таблицю (призначення відрізняється, :а не =як у більшості мов):

people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)

Тепер я можу подивитися на свій стіл:

q)show people
name  age GPA 
--------------
Joe   17  3.5 
Amy   15  3.8 
Sarah 18  3.33

І я можу запитати його:

q)select from people where GPA>3.4
name age GPA
------------
Joe  17  3.5
Amy  15  3.8

2

Коли я вперше почув про них, я виявив, що об'єднання в C ++ є "химерним". Я все ще не потрапив у сценарій, коли вони очевидний вибір для реалізації.


3
Профспілки прийшли від C. Одним хорошим прикладом є структура zval у php.
Мартін Вікман

2
Я використовував їх в емуляторі Z80, щоб легко отримати доступ до 16-бітових регістрів як цілі регістри (HL, BC) і як 8-бітні регістри (H, L, B і C). Це відображає те, як вони використовуються в Z80 asm. Також у "варіантах", клас, який може містити значення різних типів (наприклад, int / float) - не впевнений, чому я не використовував підкласи, але це було сенс на той час :)
ggambett

@ggambett: Я точно зробив те саме для своїх програм Z80! Тільки те, що я також додав бітове поле для доступу до окремих прапорів у реєстрі F.
Конаміман

2

Я все ще намагаюся обернути голову навколо того, що багатопараметрична функція стає у F # та інших функціональних мовах. В основному int f (Foo, Bar) стає функцією f (Foo)

Це дві функції параметрів, які приймають Foo, і Bar і повертає int - це дійсно функція одного параметра, яка приймає Foo і повертає функцію одного параметра, яка приймає смугу і повертає int. Але якось ви можете назвати це за двома параметрами, якщо хочете. Я написав пост про це тут


8
Швидше, функція f(Foo, Bar)- це те саме, що функція, f(Foo)яка повертає іншу функцію, f'(Bar)яка повертає значення, що f(Foo, Bar)було б повернено. Тобто, якщо ви виправите аргумент 'Foo', але не 'Bar', у вас є функція, яка не залежить від 'Foo', але все ще залежить від аргументу 'Bar'. Це характерно для функціональних мов; це називається «каррінг».
9000

2

Регулярні вирази:

Вони надзвичайно потужні, але компактні об'єкти.
Мови, які вбудовані, мають чудову здатність маніпулювати текстом (не чути розбору слів, вони не такі гарні).


2
Цілком можливо розібрати безліч простих граматик з регулярними виразами. Наприклад, порівняно тривіально розібрати файл ini з мінімумом логіки поверх набору регексів. Помилка багатьох людей полягає в тому, що вони намагаються проаналізувати дуже складні граматики (тобто XML / HTML).
Меттью Шарлі


@ Марк C: Верхня відповідь - це рекорд, що склав 4320 голосів. Не можна
Мартін Йорк,

Так, це було для гумору. Це спало на думку, коли я прочитав коментар Метью.
Марк C

2

Кілька мов у сімействі функціоналів мають клас типів, відомий як Unity. Відмінною рисою типів Unity є те, що вони не містять інформації, вони є нульовими бітовими типами. Тип єдності (в деяких варіантах) також є єдиним його значенням, або (у більшості інших) має лише одне значення (тобто сам по собі не є типом).

Вони є корисними, однак, оскільки вони відрізняються типами. Оскільки ви не можете неявно перетворювати з одного типу єдності в інший, ви можете поставити перевірку статичного типу для роботи дуже ефективно та виразно.

Єдність - це також спосіб, коли більшість таких мов описує Enums, дозволяючи новому типу бути будь-яким із визначених наборів інших типів, або описувати, можливо, типи, які можуть бути або значеннями типового типу (скажімо, цілим числом) , або мають значення, яке не відповідає значенню.

Деякі мови, які не використовують багатство визначених користувачем типів єдності, все ще є в них єдністю в тій чи іншій формі. Наприклад, Python має принаймні три типи єдності, NoneType, NotImplementedType, і EllipsisType. Цікаво, що перші два обоє означають щось на кшталт "Немає значення", а третє використовується в складних значеннях (конкретно, вирази фрагментів) для представлення цікавих спеціальних випадків.

Інші цікаві приклади єдності включають NULLв sql та undefinedjavascript, але не voidв C чи C ++. voidне вдається. Незважаючи на те, що воно описує значення відсутньої інформації, але жодне фактичне значення не може мати тип void.


Я думаю, ви маєте на увазі "тип одиниці".
Джейсон Бейкер

2

symbolТип Рубі трохи незвичний. По суті це рядок, що реалізує однотонний візерунок. Або щось. Поки що я знайшов найкраще використання символів для відстеження станів та передавання імен функцій.


Також як ключі до карти для порівняння клавіш O (1).
Джеремі Хайлер

Ну, це насправді не так незвично. Рубі успадкував її від Smalltalk, який успадкував її від Lisp. У Scala це теж є, я думаю. Насправді майже кожна мовна реалізація (компілятор чи інтерпретатор) має таблицю символів внутрішньо, Lisp, Smalltalk та Ruby просто піддають її програмісту.
Йорг W Міттаг

1

КОБОЛ. По суті лише два основних типи даних, рядки та числа, але ви повинні точно вказати , як вони викладені в пам'яті, наприклад PIC S9(5)V99 COMP-3.


Я можу це перемогти. BCPL має один тип даних - слово; дивіться en.wikipedia.org/wiki/BCPL
Stephen C

Існують різні типи чисел (COMP, COMP-1, COMP-2, COMP-3).
Девід Торнлі

Це звучить жахливо. Чи можете ви детальніше розглянути, що означають ці деталі?
Марк C

S= підписаний, 9(5)= 5 цифр, V= неявна десяткова крапка, 99= ще 2 цифри, COMP-3= BCD + знак nybble.
dan04

1

У Кліппера були "Кодові блоки", які були схожі на анонімні методи. Вони можуть бути передані навколо та оцінені за потребою, як правило, як форма зворотного дзвінка. Ви часто використовуєте їх для таких речей, як виконання обчислень під час руху, представляючи таблиці даних.


0

VHDL має фізичні типи. Літерал такого типу включає як значення, так і одиницю. Ви також можете визначити підрозділи. Наприклад, заздалегідь визначений фізичний тип 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;

Разом з перевантаженням оператора ви можете визначити дуже цікаві речі.


0

Clojure цікавий тим, що в ньому є мета-концепція "абстракцій", що пронизують мову. Приклади:

  • Колекції
  • Послідовності (ліниві та не ліниві)
  • Функції вищого порядку
  • Мультиметоди
  • Протоколи
  • Керовані посилання
  • Макроси
  • різні інші .....

У певній мірі абстракції доводять крайність " принцип єдиної відповідальності ". Вам належить скласти їх, щоб отримати потрібну функціональність, але ви можете бути надзвичайно гнучкими в тому, як ви склеюєте їх.

Наприклад, якщо ви хочете, щоб система OOP на основі класу мала спадок, ви можете створити одну з цих основних абстракцій порівняно швидко.

На практиці самі абстракції розроблені таким чином, що можливі кілька реалізацій, наприклад, через специфічні інтерфейси, такі як clojure.lang.ISeq для послідовностей або clojure.lang.IFn для функцій вищого порядку.

На цю тему є цікаве відео: Мистецтво абстракції


0

Якщо ви хочете мову унікального типу, відправтесь на BCPL . Ця мова має лише один тип даних, причому слово є фіксованою кількістю бітів для мовної реалізації.


0

У Googles Go є тип "канал", який є досить унікальним.


1
Канали не є унікальними. Багато мов їх є. Фелікс мав їх за 10 років до існування Google :) Окамл мав їх за 10 років до існування Фелікса.
Yttrill

І ще існувала принаймні одна мова, яка мала канали до існування Ocaml. Все ще один з найменш доступних типів у мовах програмування.
Brainlag
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.