Здравствуйте, VladD2, Вы писали:
VD>Пипец ты упертый.
Ну мы же идиому обсуждаем.
VD>Вот такой же код из исходного опшона:
VD>https://github.com/rsdn/nemerle/blob/master/lib/option.n#L106
VD>VD> public Value : T
VD> {
VD> get {
VD> match (this) {
VD> | Some (x) => x
VD> | None =>
VD> throw System.ArgumentException ("option.Value")
VD> }
VD> }
VD> }
VD>
VD>Как говорится, найдите 10 отличий.
Так тоже нельзя.
Вангую, что эта хрень нужна исключительно для интероперабельности с другими ООП-языками на дотнете.
Но в option хоть есть ср-ва правильного использования, бо это ж variant! ))
Даже взять извлечение дефолтного значения, вот это правильный код (option[T]):
public WithDefault (val : T) : T
{
match (this) {
| Some (v) => v
| None => val
}
}
А вот за это руки поотрывать и отлучать от программирования на веки вечные (ValueOption[T]):
public GetValueOrDefault() : T { _value }
Это ты писал?
Ты что творишь-то?
Это же одна из бед дотнета как такового, что некое "дефолтное значение" некоей прикладной структуры может являться
не валидным значением, т.е. источником ошибок.
Тебе же специально дали иммутабельный по-умолчанию Nemerle, чтобы ты эффективно боролся именно с подобного рода проблемами — не создавал неинициализированных значений. И тут ты такой — а нате вам протаскивание проблемы прямо в вашу иммутабельность.
V>>В том-то и беда для ООП-языков, что тип вариант нормально не выразить
VD>Очередной раз несешь околесицу. С точки зрения использования разницы нет.
Разница есть с т.з. безопасности.
Ты действительно НЕ понял вот этой фразы, относительно сценариев Optional для ООП-языков?
именно в случае Optional объявление предварительно "пустого" extractedValue убивает всю идею на корню
И ты действительно НЕ понял вот этого паттерна для ООП-языков:
Optional<MyType> optional = getValueFromSomewhere();
optional.tryExtract(extractedValue => { /* callback */ });
Ну это уже за гранью добра и зла...
VD>Сказал бы, что хочешь паттер-матчинг, так я тебе бы сразу ответил бы, что это не проблема.
Я, вроде бы, однозначно выразился в плане того, что я хочу.
VD>Во-первых в Немерле можно делать МП и не по объектам, а во вторых в Немерле есть возможность расширения МП. В частности вот эти вот строки:
VD>https://github.com/rsdn/nemerle/blob/master/lib/option.n#L215
VD>VD> [ExtensionPattern(VSome(value) = ValueOption where(HasValue=true, Value=value))]
VD> [ExtensionPattern(VNone() = ValueOption where(HasValue=false))]
VD> public struct ValueOption[T]
VD> {
VD>
ЧТД.
За один только ExtensionPattern весь Немерле можно списать в утиль.
Это уже не язык получается, а невесть что.
VD>Тоже самое без расширений:
VD>VD>def Plus(x : ValueOption[int], y : ValueOption[int])
VD>{
VD> | (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=false)) => x
VD> | (ValueOption where(HasValue=false), ValueOption where(HasValue=true, Value=y)) => y
VD> | (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=true, Value=y)) => x + y
VD>}
VD>
Опять кошмар с т.з. ФП.
1. ПМ по ООП-объектам не гарантирует полноту (внутреннее-то устройство закрыто) — получаем профанацию.
2. Одну из комбинаций можно было и забыть.
VD>и аналог для встроенного (вариантного) опшона:
VD>VD>def Plus(x : optin[int], y : optin[int])
VD>{
VD> | (Some(x), None) => x
VD> | (None, Some(y)) => y
VD> | (Some(x), Some(y)) => x + y
VD>}
VD>
А то, что забыли про комбинацию (None, None) — компилятор не напомнит, что ле?
Или молча вернет то самое "дефолтное" значение для такой комбинации?
VD>ОбъяснениеАвтор: VladD2
Дата: 22.11.11
проходящего.
Даже лень ходить по ссылке, а что там?
Пока что мне очевидно, что происходящее в твоём собственном коде надо объяснять ТЕБЕ.
V>>Но ведь именно в случае Optional объявление предварительно "пустого" extractedValue убивает всю идею на корню.
V>>Не видишь разве сам?
VD>Вижу, что ты в очередной раз трепишься вместо того, чтобы просто спросить у знающих людей.
Началось...
Я читал знающих людей, исследующих системы типов и безопасность кода. Это засчитывается за "спросить"? ))
В твоём коде безопасностью и не пахнет.
VD>Та же фигня у тебя с GLR и всем остальным.
Продолжается...
Конкретно ты пока со своим простейшим OptionValue еще не разобрался — что и как ты наделал.
Какой там в опу GLR...