Re[7]: Опциональные типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.02.17 10:25
Оценка:
Здравствуйте, vdimas, Вы писали:


VD>>https://github.com/rsdn/nemerle/blob/master/lib/option.n#L217


V>
V>    public Value : T
V>    {
V>      get
V>      {
V>        if (HasValue) _value 
V>        else assert(false, "try use Value when it not set");
V>      }
V>    }
V>

V>Кошмар.

Пипец ты упертый. Вот такой же код из исходного опшона:
https://github.com/rsdn/nemerle/blob/master/lib/option.n#L106
    public Value : T
    {
      get { 
        match (this) {
          | Some (x) => x
          | None =>
            throw System.ArgumentException ("option.Value")
        }
      }
    }

Как говорится, найдите 10 отличий.

V>В том-то и беда для ООП-языков, что тип вариант нормально не выразить


Очередной раз несешь околесицу. С точки зрения использования разницы нет.

V>потому что единственная возможность, когда в ООП можно одновременно разветвиться и изъять "откуда-то" значение, это вот такая конструкция:

V>
V>MyType extractedValue;
V>Optional<MyType> optional = getValueFromSomewhere();

V>if(optional.tryExtract(extractedValue)) {
V>    // blah-blah-blah
V>}
V>


Столько слов не по делу. Сказал бы, что хочешь паттер-матчинг, так я тебе бы сразу ответил бы, что это не проблема. Во-первых в Немерле можно делать МП и не по объектам, а во вторых в Немерле есть возможность расширения МП. В частности вот эти вот строки:
https://github.com/rsdn/nemerle/blob/master/lib/option.n#L215
  [ExtensionPattern(VSome(value) = ValueOption where(HasValue=true, Value=value))]
  [ExtensionPattern(VNone()      = ValueOption where(HasValue=false))]
  public struct ValueOption[T]
  {


Позволяют использовать VSome(value) и VNone() для матчинга ValueOption. В них же видно во что они переписываются:
ValueOption where(HasValue=true, Value=value)


Вот примеры использования:
def Plus(x : ValueOption[int], y : ValueOption[int])
{
  | (VSome(x), VNone)    => x
  | (VNone,    VSome(y)) => y
  | (VSome(x), VSome(y)) => x + y
}

Тоже самое без расширений:
def Plus(x : ValueOption[int], y : ValueOption[int])
{
  | (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=false))         => x
  | (ValueOption where(HasValue=false),         ValueOption where(HasValue=true, Value=y)) => y
  | (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=true, Value=y)) => x + y
}

и аналог для встроенного (вариантного) опшона:
def Plus(x : optin[int], y : optin[int])
{
  | (Some(x), None)    => x
  | (None,    Some(y)) => y
  | (Some(x), Some(y)) => x + y
}

Объяснение
Автор: VladD2
Дата: 22.11.11
проходящего.

V>Но ведь именно в случае Optional объявление предварительно "пустого" extractedValue убивает всю идею на корню.

V>Не видишь разве сам?

Вижу, что ты в очередной раз трепишься вместо того, чтобы просто спросить у знающих людей. Та же фигня у тебя с GLR и всем остальным.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.