Усі ми бачили ціле число, плаваючу крапку, рядок та випадковий десятковий тип. Які є найбільш дивні чи унікальні чи корисні типи, з якими ви стикалися, корисні чи ні?
Усі ми бачили ціле число, плаваючу крапку, рядок та випадковий десятковий тип. Які є найбільш дивні чи унікальні чи корисні типи, з якими ви стикалися, корисні чи ні?
Відповіді:
Я короткий:
Maybe a
в Хаскелл.
За допомогою цієї простої конструкції мова вирішує проблему збоїв, або NullPointerException
вона акуратно переходить в бік "Помилки в мільйон" Тоні Хоара :)
Чесно кажучи, необов'язкове присутність перевіряється під час компіляції? Це мрійливо ...
Option
ім'я не подобається . Чому ні Optional
! Це може бути тому, що я не є носієм мови, але Option
не передає для мене "необов'язкового" значення.
Maybe
Ім'я мило: «Що у вас є?» "Можливо, Інт". Однак дійсно акуратний біт полягає в тому, що він є і функтором, і монадою, що, звичайно кажучи, означає, що ви отримуєте нульове поширення безкоштовно. Ніколи не потрібно ставити нульові перевірки всередині функцій або в середині коду; вам потрібно коли-небудь перевірити це в самому кінці коду, якщо він взагалі є.
Maybe
монада для Рубі: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
Мене багаторічно люблять void *
. Це, мабуть, симптом чогось глибоко недосконалого в мені.
void *
і Pascal / Delphi Pointer
.
У Луа є вбудований стіл, який найбільше вражає. Він має вбудований хешбел та вектор, і із застосуванням метатабелів може бути основоположною базою для об'єктно-орієнтованого програмування на процедурній мові.
Кожен індекс таблиці може приймати будь-яку з основних мовних структур (число, булева, рядок, функція -ее, функції - це типи на lua - та таблиці).
Я здивований, поки ніхто не згадав про монади чи алгебраїчні типи даних.
У Lisp є два цікавих типи: t
і nil
. Що в них цікаво, це те, що все є t
і нічого не є nil
.
nil
t
SNOBOL: шаблон (по суті, LL (1) парсер, якщо я його правильно запам’ятав).
Фортран має загальні блоки; це один з найменш поширених типів даних у сучасних мовах або, скоріше, незвичний спосіб ефективного обміну даними.
Фортран 95 має типи інтервалів та вбудовану інтервальну арифметику.
Список не був би повним без монадичних типів, знайдених у Haskell. Щоб їх зрозуміти, потрібно докласти трохи зусиль.
Delphi має набори ( див. Також ), які, я не вважаю, реалізовані так само, як і в інших мовах.
Це робить зберігання багато змінних атрибутів у базах даних вітерцем: D
Я гадаю, що це дійсно дивно, що виходить з програмування на класичній архітектурі, але, безумовно, одним із найважчих для мене типів спочатку був квантовий регістр , який відображається в QCL .
PL / SQL дозволяє оголошувати змінні типу my_table.some_column%type
... Я вважаю це досить чортовим корисним.
І C # дозволяє вам оголосити об'єкти як нульові чи ні, хоча я не впевнений, що вважається типом.
cursor%rowtype
це навіть смішніше: це динамічно сформований тип запису, який відображає, у яких стовпцях повертається запит курсора.
У мене було м'яке пляма в моєму серці для Euphoria типів даних «s , коли я був молодший ,
Вона структурована таким чином:
Object
-> Atom
-> Sequence
Послідовність = Послідовність об'єктів
-- 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}
Фелікс має анонімні типи сум. Тип записується так:
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 одиниць. Шкода + не асоціативно :)
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
Коли я вперше почув про них, я виявив, що об'єднання в C ++ є "химерним". Я все ще не потрапив у сценарій, коли вони очевидний вибір для реалізації.
Я все ще намагаюся обернути голову навколо того, що багатопараметрична функція стає у F # та інших функціональних мовах. В основному int f (Foo, Bar) стає функцією f (Foo)
Це дві функції параметрів, які приймають Foo, і Bar і повертає int - це дійсно функція одного параметра, яка приймає Foo і повертає функцію одного параметра, яка приймає смугу і повертає int. Але якось ви можете назвати це за двома параметрами, якщо хочете. Я написав пост про це тут
f(Foo, Bar)
- це те саме, що функція, f(Foo)
яка повертає іншу функцію, f'(Bar)
яка повертає значення, що f(Foo, Bar)
було б повернено. Тобто, якщо ви виправите аргумент 'Foo', але не 'Bar', у вас є функція, яка не залежить від 'Foo', але все ще залежить від аргументу 'Bar'. Це характерно для функціональних мов; це називається «каррінг».
Вони надзвичайно потужні, але компактні об'єкти.
Мови, які вбудовані, мають чудову здатність маніпулювати текстом (не чути розбору слів, вони не такі гарні).
Кілька мов у сімействі функціоналів мають клас типів, відомий як Unity. Відмінною рисою типів Unity є те, що вони не містять інформації, вони є нульовими бітовими типами. Тип єдності (в деяких варіантах) також є єдиним його значенням, або (у більшості інших) має лише одне значення (тобто сам по собі не є типом).
Вони є корисними, однак, оскільки вони відрізняються типами. Оскільки ви не можете неявно перетворювати з одного типу єдності в інший, ви можете поставити перевірку статичного типу для роботи дуже ефективно та виразно.
Єдність - це також спосіб, коли більшість таких мов описує Enums, дозволяючи новому типу бути будь-яким із визначених наборів інших типів, або описувати, можливо, типи, які можуть бути або значеннями типового типу (скажімо, цілим числом) , або мають значення, яке не відповідає значенню.
Деякі мови, які не використовують багатство визначених користувачем типів єдності, все ще є в них єдністю в тій чи іншій формі. Наприклад, Python має принаймні три типи єдності, NoneType
, NotImplementedType
, і EllipsisType
. Цікаво, що перші два обоє означають щось на кшталт "Немає значення", а третє використовується в складних значеннях (конкретно, вирази фрагментів) для представлення цікавих спеціальних випадків.
Інші цікаві приклади єдності включають NULL
в sql та undefined
javascript, але не void
в C чи C ++. void
не вдається. Незважаючи на те, що воно описує значення відсутньої інформації, але жодне фактичне значення не може мати тип void
.
symbol
Тип Рубі трохи незвичний. По суті це рядок, що реалізує однотонний візерунок. Або щось. Поки що я знайшов найкраще використання символів для відстеження станів та передавання імен функцій.
КОБОЛ. По суті лише два основних типи даних, рядки та числа, але ви повинні точно вказати , як вони викладені в пам'яті, наприклад PIC S9(5)V99 COMP-3
.
S
= підписаний, 9(5)
= 5 цифр, V
= неявна десяткова крапка, 99
= ще 2 цифри, COMP-3
= BCD + знак nybble.
У Кліппера були "Кодові блоки", які були схожі на анонімні методи. Вони можуть бути передані навколо та оцінені за потребою, як правило, як форма зворотного дзвінка. Ви часто використовуєте їх для таких речей, як виконання обчислень під час руху, представляючи таблиці даних.
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;
Разом з перевантаженням оператора ви можете визначити дуже цікаві речі.
Clojure цікавий тим, що в ньому є мета-концепція "абстракцій", що пронизують мову. Приклади:
У певній мірі абстракції доводять крайність " принцип єдиної відповідальності ". Вам належить скласти їх, щоб отримати потрібну функціональність, але ви можете бути надзвичайно гнучкими в тому, як ви склеюєте їх.
Наприклад, якщо ви хочете, щоб система OOP на основі класу мала спадок, ви можете створити одну з цих основних абстракцій порівняно швидко.
На практиці самі абстракції розроблені таким чином, що можливі кілька реалізацій, наприклад, через специфічні інтерфейси, такі як clojure.lang.ISeq для послідовностей або clojure.lang.IFn для функцій вищого порядку.
На цю тему є цікаве відео: Мистецтво абстракції
Якщо ви хочете мову унікального типу, відправтесь на BCPL . Ця мова має лише один тип даних, причому слово є фіксованою кількістю бітів для мовної реалізації.
У Googles Go є тип "канал", який є досить унікальним.