Почему мне нужно использовать тип блока в F #, если он поддерживает тип void?

Я прочитал эту статью MSDN:

Тип устройства (F #)

... Тип устройства - это тип, который указывает на отсутствие конкретной стоимость; тип единицы имеет только одно значение, которое действует как заполнитель, если другое значение не существует или не требуется... Тип блока напоминает тип void на таких языках, как С# и С++...

Итак... Хорошо, я понимаю, что тип блока такой тип, который имеет только одно значение (). Но у меня есть несколько вопросов:

  • Зачем это нужно?
  • Когда это необходимо?

Я не понимаю, почему бы не использовать тип void в F #, например, С# и С++.

Если я посмотрю на следующую таблицу:

Примитивные типы (F #)

Type   .NET Type    Description  
void   Void         Indicates no type or value.

Я вижу, что F # имеет тип void. Поэтому я не понимаю, зачем нужен тип единицы; похоже, что он очень похож на void.

Я полагаю, что он относится к парадигме функционального языка и почему он нужен, поэтому, пожалуйста... объясните мне больше об этом.

Ответ 1

В С# нет значения типа void, которое может использоваться как тип аргумента. Кроме того, void не может использоваться в качестве аргумента общего типа (так, например, для С# необходимо использовать типы делегатов parallel Func<...> и Action<...>, но для F # требуется только один тип функции ... -> ..., который может абстрагироваться по обеим). Это приводит к значительному упрощению программирования F # во многих случаях; например, действие Async, которое выполняет некоторые побочные эффекты, но не возвращает значение, является экземпляром типа Async<unit>, но на С# нет способа создать соответствующий Task<void> или что-то еще.

Ответ 2

Смотрите Тип устройства из Википедии

Тип Void как тип единицы измерения

В C, С++, С# и Java void выражает пустой тип. Тип устройства в C будет struct {}, но пустая структура запрещена C язык спецификация. Вместо этого void используется таким образом, чтобы имитирует некоторые, но не все, свойства типа единицы, поскольку подробно ниже.

Разница в вызове

Первое заметное различие между истинным типом единицы и пустотой тип состоит в том, что тип единицы измерения всегда может быть типом аргумента для функция, но тип void не может быть типом аргумента в C, несмотря на то, что он может показаться единственным аргументом в списке.

Разница в хранении

Вторая заметная разница заключается в том, что тип void, являющийся пустым, может никогда не сохраняются в типе записи, то есть в структуре или классе в C/С++. Напротив, тип устройства может быть сохранен в записях в функциональных языков программирования, то есть он может отображаться как тип поле; приведенная выше реализация типа единицы в С++ также может быть сохраняются. Хотя это может показаться бесполезной функцией, это позволяет экземпляр, чтобы изящно реализовать набор как карту типа единицы; в отсутствие единичного типа, можно все же реализовать набор таким образом путем сохраняя некоторое фиктивное значение другого типа для каждого ключа.

Ответ 3

Другой способ взглянуть на это - визуализировать() как кортеж с arity 0.

Учитывая, что() используется для разграничения кортежа, получаем

(abc, def, xyx) a tuple with arity of 3
(abc, def) a tuple with arity of 2
(abc) a tuple with arity of 1, which can be reduced to abc
() a tuple with arity of 0, called unit

В функциональных языках, основанных на исчислении лямбда, функция принимает один параметр и возвращает одно значение. Параметрирование поддерживается каррированием. Параметры и возвращаемые значения также могут быть кортежами для поддержки нескольких значений.

Моя интерпретация единицы /() не является значением, выраженным в виде кортежа.