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