Re[8]: Что должен возвращать if?
От: Evgeny.Panasyuk Россия  
Дата: 21.10.14 11:03
Оценка:
Здравствуйте, gbear, Вы писали:

G>А как вы собираетесь это потом использовать?! Повторюсь, смысл вычисления в maybe — возможность понять что "что-то пошло не так". Использование неявного приведения Just[T] к T (которое, кстати, вполне возможно) лишает нас этой возможности. Если нет неявного приведения,


Да, в этом случае его быть не должно.

G>то "просто так" использовать результат вычисления if-без-else в тех же местах, где мы можем использовать результат вычисления if-с-else не получится.

G>Вот и вся проблема.

И там и там Variant. В том что набор типов Variant'а будет отличаться при комментировании ветки else — не вижу проблемы

EP>>Почему же? Для обобщённого кода как раз и не лишено — вне зависимости от того, значения каких типов возвращают ветки if-else, всё выражение вычислится в Variant.

G>Ну причем тут variant-то?! Речь идет о том, что нет смысла вычислять if-с-else в maybe.

Variant — своего рода обобщение Maybe. Вычислять if-с-else в maybe — действительно не имеет смысла.

EP>>В случае когда у нас Variant<T>, полноценный функторный fmap не нужен, точнее можно без него. Достаточно T unbox(Variant<T> x);, или короткого оператора.

G>По-ходу, как-то я не ясно выразился. Я вам про одно — вычисление if-без-else в maybe, а вы мне про другое — вычисление if-c-else в variant
G>Ладно, поговорим за variant...
G>А зачем вам какой-то явный unbox для variant? Вполне можно обойтись и неявным приведением к.

А где именно оно будет происходить? if-else будет сразу иметь этот тип? Или при присвоении к значению типа T?

G>Смотрите... вот получили мы какой-то variant[string, int, ?DateTime], условно. Пусть даже у него есть какой-то unbox.


А для него не будет unbox'а — unbox это только для variant[T], то есть для тех случаев, когда обе ветки if-else имеют одинаковый тип результата, и variant внутри имеет значение только одного определённого типа.

G>Нормально обработать его можно только через PM. Вы же, надеюсь, не собираетесь прогонять его через очередной if? Об этом и речь.


Можно и через if, а можно и спрятать этот if/условный переход в библиотеку, так как это сделано в boost::variant.
Обычная работа с variant'ом. В чём проблема-то?

G>>>Вычисление if-с-else в variant, само по себе (без попытки добиться "симметрии") может иметь смысл. Но только в том случае, когда PM и использование variant уйдут на ступень выше, так сказать.

EP>>То есть основная проблема заключается в каких-то пробелах в Nemerle с Varaint'ом как таковым, а не в самой идеи if-else -> Variant?
G>Nemerle тут вообще не причем Недостаточно вычислить if в variant[A, B, C]. Нужно еще как-то "узнать", что конкретно этот variant сейчас в себе несет... A, B или C. И его нужно будет либо дополнительно проверять...

Точно также как и в случае с виртуальным вызовом метода результата

G>Но просто так (без PM) использовать не получится. Хоть в Nemerle, хоть еще где.


Во-первых, в Nemerle же есть PM — в чём проблема?
Во-вторых — я же приводил уже примеры использования variant'а в C++ — нужен конкретный код?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.