@daniil14056

Что за тип Unit в Haskel Rust Kotlin? Чем отличается от Void?

Раз 500 прочел, не понял ни разу.
Можно ли увидеть аналог пример кода на c# java с этим типом? Как-то наглядно продемонстрировать отличие от void. Иначе никак не пойму?
А еще, вот к примеру я придумал, почему нету(может этот тип и есть), К примеру в c# есть понятие Boxing типов при касте через object
int a=(int)(object)1;
Что довольно дорого и долго. С выделением памяти в куче.
А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово? Ведь это прекрасно покроет все простые структурные типы, int char double., Enum, кортежи в 8 байт. А все остальное уже как объект.
void fun(object obj){}
void fun(struct obj){} 
// почему такого нету, вроде же легко можно добавить, я куча раз сталкивался, 
// когда дженерик писать прям в лом, или большие изменения внесет, или еще что, 
// а передать надо byte int double
  • Вопрос задан
  • 288 просмотров
Решения вопроса 3
vabka
@vabka Куратор тега Rust
void означает, что функция ничего не возвращает. Такие функции не получится использовать в выражениях и их результат нельзя никуда присвоить. Из-за этого многие обобщённые вещи приходится писать по два раза: один раз для обычных функций и ещё раз для функций, которые возвращают void.
Такие функции ещё называют процедурами.

unit же напротив является значением, просто всего с одним возможным вариантом. Компиляторы часто его оптимизируют так, что он занимает 0 байт и не требует никаких инструкций для передачи. То же самое с указателем на юнит.


Можно ли увидеть аналог пример кода на c# java с этим типом?

Нельзя, тк в их системе типов такого типа просто нет. Можно его имитировать при помощи пустой структуры например.
Но в мире дотнета есть f#, а в мире жавы - скала и котлин.

А еще, вот к примеру я придумал, почему нету(может этот тип и есть), К примеру в c# есть понятие Boxing типов при касте через object
int a=(int)(object)1;
Что довольно дорого и долго. С выделением памяти в куче.
А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово? Ведь это прекрасно покроет все простые структурные типы, int char double., Enum, кортежи в 8 байт. А все остальное уже как объект.

1. А что делать если тебе боксинг явно нужен?
2. А где ты будешь метаданные передавать? Как в такой ситуации отличить тот же long от ссылки на объект?
3. По спецификации передаётся ссылка, а не двойное машинное слово.

И каким боком боксинг имеет отношение к юниту?
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Я не понимаю зачем ты поставил такое число тегов? Мы что здесь 4 разных языка обсуждать будем?
У них у всех разные механизмы работы с типами.

Что за тип Unit в Haskel Rust Kotlin? Чем отличается от Void?
Раз 500 прочел, не понял ни разу.

Программирование - это практическая наука. Это не философия и не политология.
Тебе не надо 500 раз читать. Читай 1 раз и пиши программу. И смотри как она себя ведет.
void - это просто заглушка. Синтаксически полезна в операциях с указателями чтобы
указывать что тип ссылки - неизвестен. Unit в некоторых языках (Scala) это тип-значение
и его можно возвращать. В Хаскеле чтобы вернуть "ничто" - используется монада Maybe.

int a=(int)(object)1;
Что довольно дорого и долго. С выделением памяти в куче.

Не понимаю что здесь дорого и долго? Или это пример неудачный. Хороший компиллятор
сворачивает боксированные типы и сводит их к примитивам. Боксы также в runtime
инициализируются через Flyweight чтоб иметь ровно 1 экземпляр на примитив.

Ведь это прекрасно покроет все простые структурные типы, int char double.,

Какие структурные типы? Откуда ты берешь терминилогию. Я тебя очень прошу в данном
форуме - не придумывай новое применение устоявшимся терминам!

То что ты хочешь (передача 8 байт) хорошо реализуется в Си и Ассемблере. Если тебе нужен именно такой
уроверь абстракции - то тебе прямая дорога туда. Я напомню тебе также что типы в ЯВУ создавались
долгие десятилетия. Они создавались с целью помочь программисту не делать ошибок и проводить
формальное доказательство правоты программы. Программа с типами - имеет шанс быть правильной.
Программа лишенная мехнизмов проверки типов - будет кишмя кишеть ошибками рантайма. И даже
тестирование не будет доказывать их отсутствие в будущем.
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Можно ли увидеть аналог пример кода на c# java с этим типом? Как-то наглядно продемонстрировать отличие от void. Иначе никак не пойму?


Unit это специальный тип, который больше нужен для инфраструктуры. Например, в функциональных языках чтобы делать цепочки вызовов: там нет понятия инструкции, зато можно передать Unit, который возвращается функцией, которая должна быть выполнена первой.

Если хочешь в дотнете - то иди в F#. Там есть Unit, попробуй функциональное программирование.

А почему нету Типа, который ни чего не упаковывает, а просто передает двойное машинной слово?


Это long. Передавай везде его, а внутри делай каст/приведение. А вообще, зачем делать стек еще больше? Если надо передать только байт, ты предлагаешь передавать сразу 8?

кортежи в 8 байт.


Где кортежи в 8 байт?


// почему такого нету, вроде же легко можно добавить, я куча раз сталкивался,
// когда дженерик писать прям в лом, или большие изменения внесет, или еще что,
// а передать надо byte int double


Используй ограничения на дженерики - where тебе в помощь
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
includedlibrary
@includedlibrary
Тип Void в Haskell, в отличие от (), не имеет никаких значений. То есть вы не можете создать значение, имеющее данный тип. В свою очередь у () есть одно допустимое значение. Тип Void также встречается в системах проверки доказательств для обозначения ложности утверждения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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