Мы все видели целое число, число с плавающей точкой, строку и случайный десятичный тип. Какие из самых странных, уникальных или полезных типов вы встречали, полезные или нет?
20
Мы все видели целое число, число с плавающей точкой, строку и случайный десятичный тип. Какие из самых странных, уникальных или полезных типов вы встречали, полезные или нет?
Ответы:
Я буду коротким
Maybe a
в Хаскеле.
С помощью этой простой конструкции язык решает проблему сбоев или
NullPointerException
аккуратно обходит «ошибку на миллион» Тони Хоара :)Честно говоря, необязательное присутствие проверяется во время компиляции? Это похоже на сон ...
источник
Option
имя. Почему нетOptional
! Это может быть потому, что я не являюсь носителем языка, ноOption
не передаю «необязательное» значение для меня.Maybe
Имя мило: «Что у вас есть?» «Может быть, Int». Однако действительно интересным является то, что он является и функтором, и монадой, что, попросту говоря, означает, что вы получаете нулевое распространение бесплатно. Вам никогда не нужно ставить нулевые проверки внутри функций или в середине кода; вам нужно только проверить это в самом конце кода, если это вообще необходимо.Maybe
для Ruby: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-rubyЯ постоянно увлекаюсь
void *
. Это, вероятно, симптом чего-то глубоко испорченного во мне.источник
void *
и Паскаль / DelphiPointer
.У Lua есть встроенный стол, который впечатляет. Он имеет встроенную хеш-таблицу и вектор, и с использованием метатаблиц может стать фундаментальной основой для объектно-ориентированного программирования на процедурном языке.
Каждый индекс таблицы может получить любую из основных языковых структур (число, логическое значение, строка, функция -yes, функции являются типами на lua - и таблицы).
источник
Я удивлен, что никто еще не упомянул Монады или Алгебраические Типы данных.
источник
Лисп имеет два интересных типа:
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, когда я был моложе
Он структурирован так:
Sequence = последовательность объектов
Смотрите: Справочное руководство
Примечание: «jon» - это краткий способ записи последовательности значений ASCII. Например, так
"ABCDEFG"
же, как{65, 66, 67, 68, 69, 70, 71}
источник
Феликс имеет анонимные типы сумм. Тип написан так:
как это было бы в теории. Значения безобразны:
за исключением, возможно, за единицу суммы, такой как
3 = 1 + 1 + 1
который, к сожалению, использует нулевой подсчет происхождения для «C совместимости». Анонимные суммы необходимы для структурно типизированных алгебраических типов, например:
является списком T (с единственной связью). Все другие языки, которые мне известны, требуют номинально типизированных сумм, где как самому типу, так и конструкторам должны быть заданы имена.
Сокращение 3, используемое выше, мило, в библиотеке есть следующее:
и это обозначение:
является массивом статической длины 3 .. 3 - не целое число, а сумма 3 единиц. Какая жалость + не ассоциативно :)
источник
q / kdb + имеет встроенные таблицы. Поскольку это язык программирования и база данных, ориентированная на столбцы в одном, нет необходимости в LINQ или ORM.
Например, можно создать таблицу, подобную этой (назначение выделяется,
:
а не=
как в большинстве языков):Теперь я могу посмотреть на свой стол:
И я могу запросить это:
источник
Я обнаружил, что union в C ++ был «причудливым», когда я впервые услышал о них. Я до сих пор не достиг сценария, в котором они являются очевидным выбором для реализации.
источник
Я все еще пытаюсь обернуть голову тем, что становится многопараметрической функцией в F # и других функциональных языках. В основном, int f (Foo, Bar) становится func f (Foo)
Это двухпараметрическая функция, которая принимает Foo, а Bar и возвращает int на самом деле является функцией с одним параметром, которая принимает Foo и возвращает однопараметрическую функцию, которая принимает bar и возвращает int. Но как-то вы можете вызвать его с двумя параметрами, если хотите. Я написал пост об этом здесь
источник
f(Foo, Bar)
- это то же самое, что и функция,f(Foo)
которая возвращает другую функцию,f'(Bar)
которая возвращает значение, котороеf(Foo, Bar)
будет возвращено. То есть, если вы исправите аргумент «Foo», но не «Bar», у вас есть функция, которая не зависит от «Foo», но все еще зависит от аргумента «Bar». Это типично для функциональных языков; это называется «карри».Регулярные выражения:
Это чрезвычайно мощные, но компактные объекты.
Языки, на которых они встроены, обладают большой способностью манипулировать текстом (давайте не будем слышать слово «парсинг», они не так хороши).
источник
Горстка языков в функциональной семье имеет класс типов, известных как Unity. Отличительной особенностью типов Unity является то, что они не содержат информации, они являются типами с нулевым битом. Тип единства (в некоторых вариантах) также является его единственным значением или (в большинстве других) имеет только одно значение (которое само по себе не является типом).
Они полезны, хотя, потому что они являются выдающимися типами. Поскольку вы не можете неявно преобразовать один тип единства в другой, вы можете применить статическую проверку типов к работе очень эффективным и выразительным образом.
Unity также является способом, которым большинство таких языков описывают Enums, позволяя новому типу быть любым из определенного набора других типов или описывать, возможно, типы, значения, которые могут быть значениями типичного типа (скажем, целое число) или иметь значение, которое представляет собой нет значения.
Некоторые языки, которые не используют богатство пользовательских типов единства, все еще имеют единство в них, в той или иной форме. Например, Python имеет по крайней мере три типа единства,
NoneType
,NotImplementedType
, иEllipsisType
. Интересно, что первые два означают что-то вроде «Нет значения», но третий используется в комплексных значениях (в частности, в выражениях слайсов) для представления интересных частных случаев.Другие интересные примеры единства включают
NULL
в sql иundefined
в javascript, но неvoid
в C или C ++.void
выходит из строя. Даже если оно описывает значение без информации, но фактическое значение не может иметь типvoid
.источник
symbol
Тип Руби немного необычен. По сути, это строка, реализующая шаблон синглтона. Или что-то. До сих пор я обнаружил, что наилучшее использование символов для отслеживания состояний и передачи имен функций.источник
COBOL. По сути только два основных типа данных, строки и числа, но вы должны точно указать , как они расположены в памяти, например
PIC S9(5)V99 COMP-3
.источник
S
= подпись,9(5)
= 5 цифр,V
= неявная десятичная точка,99
= еще 2 цифры,COMP-3
= BCD + знак nybble.Клипер имел «блоки кода», которые были похожи на анонимные методы. Их можно передавать и оценивать по мере необходимости, как правило, в форме обратного вызова. Вы часто используете их для выполнения вычислений на лету при представлении таблиц данных.
источник
VHDL имеет физические типы. Литерал такого типа включает в себя как значение, так и единицу измерения. Вы также можете определить субъединицы. Например, предопределенный физический тип
time
:Вместе с перегрузкой операторов вы можете определять очень интересные вещи.
источник
Clojure интересен тем, что имеет мета-концепцию «абстракций», которые пронизывают язык. Примеры:
В некоторой степени абстракции доводят « принцип единой ответственности » до крайности. Вы должны составить их, чтобы получить желаемую функциональность, но вы можете быть чрезвычайно гибкими в том, как склеивать их вместе.
Например, если вам нужна система ООП на основе классов с наследованием, вы можете относительно быстро создать одну из этих основных абстракций.
На практике сами абстракции разрабатываются таким образом, что возможны несколько реализаций, например, через специальные интерфейсы, такие как clojure.lang.ISeq для последовательностей или clojure.lang.IFn для функций более высокого порядка.
На эту тему есть интересное видео: Искусство абстракции
источник
Если вам нужен язык с уникальным типом, отправляйтесь в BCPL . Этот язык имеет только один тип данных, слово, являющееся фиксированным числом битов для языковой реализации.
источник
Googles Go имеет тип «Канал», который является совершенно уникальным.
источник