Пусто в constrast с Единицей

Я хотел бы понять, который является различием между этими двумя концепциями программирования. Первое представляет отсутствие типа данных, и в последнем существует тип, но нет никакой информации. Кроме того, я распознаю, что Единица прибывает из функционального программирования теоретическая основа, но я все еще не могу понять то, что является удобством использования примитивной единицы (например, в программе F#).

8
задан razlebe 6 December 2011 в 17:42
поделиться

2 ответа

Тип устройства просто делает все более регулярным. В некоторой степени вы можете думать о каждой функции в F # как о том, что она принимает один параметр и возвращает единственный результат. Функции, которым не требуются никакие параметры, на самом деле принимают «unit» в качестве параметра, а функции, которые не возвращают никаких результатов, возвращают «unit» в качестве результата. Это имеет множество преимуществ; во-первых, подумайте, как в C # вам нужно как множество делегатов «Func» для представления функций различной арности, которые возвращают значения, так и множество делегатов «Действия», которые не возвращают значения (потому что, например, Func < int, void> недопустимо - void нельзя использовать таким образом, так как это не совсем «настоящий» тип).

См. также Типы функций F #: забавы с кортежами и каррированием

12
ответ дан 5 December 2019 в 07:58
поделиться

В функциональном программировании мы обычно говорим о сопоставлении входов и выходов. Это буквально означает сопоставление аргумента с его возвращаемым значением (ями). Но если что-то будет функцией в математическом смысле / в смысле теории категорий, оно должно вернуть что-то . Значение 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 - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.

d придется прибегать к обходным путям, например иметь Action , что может стать неуклюжим.

Вот где полезна концепция unit : it ] - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.

d придется прибегать к обходным путям, например иметь Action , что может стать неуклюжим.

Вот где полезна концепция unit : it ] - это тип, но он может принимать только одно значение. Это значительно упрощает такие вещи, как построение цепочек и композицию, и значительно сокращает количество особых случаев, о которых вам нужно беспокоиться.

9
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: