Как создать экземпляр option[void].None?
От: vaskir Россия vaskir.blogspot.com
Дата: 09.01.16 09:47
Оценка:
Простой active pattern, проверяющий на не null и не пустую строку:

NotEmpty(v: string): option[string]
    match (v)
     | null | _ when v.Trim() == "" => None()
     | _ => Some(v)

active match ("foo")
 | NotEmpty(_) => Some("wow")


Работает, но хотелось бы избавиться от (_) и писать просто:

active match ("foo")
 | NotEmpty => Some("wow")


Пытаюсь использовать option[void]:

NotEmpty(v: string): option[void]
    match (v)
     | null | _ when v.Trim() == "" => None()
     | _ => Some(())


Компилятор ругается на None():

Cannot implicitly convert type 'option.None[?]' to 'option[void]'.


Может быть в Nemerle есть полноценный тип unit для таких вещей?
Re: Как создать экземпляр option[void].None?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.01.16 19:41
Оценка:
Здравствуйте, vaskir, Вы писали:

V>Может быть в Nemerle есть полноценный тип unit для таких вещей?


Полноценного быть не может, так как дотнет не поддерживает void как полноценный тип. Есть Nemerle.FakeVoid (аналог unit в F#). Но думаю, что он тебе в данном случае не поможет, так как "| NotEmpty" писать нельзя просто потому что это не допустил автор макроса "active". Это надо что-то подкрутить в самом макросе. Тогда и Nemerle.FakeVoid не понадобится.

А вообще, на практике эти этив-птаттерны как-то не используются. По крайней мере у меня ни разу не возникало такое желание.

Еще есть extensible matching. Вот его я на практике использовал.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 09.01.2016 19:42 VladD2 . Предыдущая версия .
Re[2]: Как создать экземпляр option[void].None?
От: vaskir Россия vaskir.blogspot.com
Дата: 09.01.16 20:45
Оценка:
VD>Полноценного быть не может, так как дотнет не поддерживает void как полноценный тип. Есть Nemerle.FakeVoid (аналог unit в F#). Но думаю, что он тебе в данном случае не поможет, так как "| NotEmpty" писать нельзя просто потому что это не допустил автор макроса "active". Это надо что-то подкрутить в самом макросе. Тогда и Nemerle.FakeVoid не понадобится.

Понятно, спасибо. Попробую покопаться в макросе

VD>А вообще, на практике эти этив-птаттерны как-то не используются. По крайней мере у меня ни разу не возникало такое желание.


Ну в F# они очень и очень любимы, так сказать Поэтому возникло желание заюзать их в nemerle.

VD>Еще есть extensible matching. Вот его я на практике использовал.


Ооо, очень интересно. Не active patterns, но имеют свои интересные стороны.
Re[3]: Как создать экземпляр option[void].None?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.01.16 21:34
Оценка: +1
Здравствуйте, vaskir, Вы писали:

V>Ну в F# они очень и очень любимы, так сказать Поэтому возникло желание заюзать их в nemerle.


Дык главная разница между F#-ом и Nemerle заключается в том, что Nemerle можно расширить так чтобы непосредственно удовлетворить свои потребности. Например, если захочется использовать в паттерн-матчинге регексы, можно сделать свой макрос. Точнее такой макрос уже сделан.

V>Ооо, очень интересно. Не active patterns, но имеют свои интересные стороны.


Да. Это способ изменить синтаксис, а не подменить паттерны на функции. Это несколько менее функционально, но зато не приводит к потерям производительности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.