Здравствуйте, 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++ — нужен конкретный код?