Я хотел бы понять, который является различием между этими двумя концепциями программирования. Первое представляет отсутствие типа данных, и в последнем существует тип, но нет никакой информации. Кроме того, я распознаю, что Единица прибывает из функционального программирования теоретическая основа, но я все еще не могу понять то, что является удобством использования примитивной единицы (например, в программе F#).
Тип устройства просто делает все более регулярным. В некоторой степени вы можете думать о каждой функции в F # как о том, что она принимает один параметр и возвращает единственный результат. Функции, которым не требуются никакие параметры, на самом деле принимают «unit» в качестве параметра, а функции, которые не возвращают никаких результатов, возвращают «unit» в качестве результата. Это имеет множество преимуществ; во-первых, подумайте, как в C # вам нужно как множество делегатов «Func» для представления функций различной арности, которые возвращают значения, так и множество делегатов «Действия», которые не возвращают значения (потому что, например, Func < int, void>
недопустимо - void нельзя использовать таким образом, так как это не совсем «настоящий» тип).
См. также Типы функций F #: забавы с кортежами и каррированием
В функциональном программировании мы обычно говорим о сопоставлении входов и выходов. Это буквально означает сопоставление аргумента с его возвращаемым значением (ями). Но если что-то будет функцией в математическом смысле / в смысле теории категорий, оно должно вернуть что-то . Значение void
означает, что функция ничего не возвращает, что бессмысленно в этих терминах.
unit
является функциональным ответом на void
. По сути, это тип только с одним значением, ()
. У него множество применений, но вот одно простое. Допустим, у вас есть что-то вроде этого на более традиционном императивном языке:
public static <T, U> List<U> map(List<T> in, Function<T, U> func) {
List<U> out = new ArrayList<U>(in.size());
for (T t : in) {
out.add(func.apply(t));
}
return out;
}
Это применяет определенную функцию func
к каждому элементу в списке, создавая новый список func
's тип вывода. Но что произойдет, если вы передадите функцию, которая просто печатает свои аргументы? У нее не будет типа вывода, так что вы можете указать для U
?
В некоторых языках передача такой функции нарушит этот код (например, в C #, где вы не можете назначить void
универсальному типу). Вам придется прибегнуть к обходным путям, например иметь Action
, который может стать неуклюжим.
Вот где полезна концепция unit
: it - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.
U
?
В некоторых языках передача такой функции нарушит этот код (например, в C #, где вы не можете назначить void
объекту общий тип). Вам придется прибегнуть к обходным путям, например иметь Action
, который может стать неуклюжим.
Вот где полезна концепция unit
: it - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.
U
?
В некоторых языках передача такой функции нарушит этот код (например, в C #, где вы не можете назначить void
объекту общий тип). Вам придется прибегнуть к обходным путям, например иметь Action
, который может стать неуклюжим.
Вот где полезна концепция unit
: it - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.
Action
, что может стать неуклюжим.
Вот где полезна концепция unit
: it ] - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.
Action
, что может стать неуклюжим.
Вот где полезна концепция unit
: it ] - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.