Простой 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 для таких вещей?
Здравствуйте, vaskir, Вы писали:
V>Может быть в Nemerle есть полноценный тип unit для таких вещей?
Полноценного быть не может, так как дотнет не поддерживает void как полноценный тип. Есть Nemerle.FakeVoid (аналог unit в F#). Но думаю, что он тебе в данном случае не поможет, так как "| NotEmpty" писать нельзя просто потому что это не допустил автор макроса "active". Это надо что-то подкрутить в самом макросе. Тогда и Nemerle.FakeVoid не понадобится.
А вообще, на практике эти этив-птаттерны как-то не используются. По крайней мере у меня ни разу не возникало такое желание.
Еще есть
extensible matching. Вот его я на практике использовал.
VD>Полноценного быть не может, так как дотнет не поддерживает void как полноценный тип. Есть Nemerle.FakeVoid (аналог unit в F#). Но думаю, что он тебе в данном случае не поможет, так как "| NotEmpty" писать нельзя просто потому что это не допустил автор макроса "active". Это надо что-то подкрутить в самом макросе. Тогда и Nemerle.FakeVoid не понадобится.
Понятно, спасибо. Попробую покопаться в макросе
VD>А вообще, на практике эти этив-птаттерны как-то не используются. По крайней мере у меня ни разу не возникало такое желание.
Ну в F# они очень и очень любимы, так сказать
Поэтому возникло желание заюзать их в nemerle.
VD>Еще есть extensible matching. Вот его я на практике использовал.
Ооо, очень интересно. Не active patterns, но имеют свои интересные стороны.
Здравствуйте, vaskir, Вы писали:
V>Ну в F# они очень и очень любимы, так сказать Поэтому возникло желание заюзать их в nemerle.
Дык главная разница между F#-ом и Nemerle заключается в том, что Nemerle можно расширить так чтобы непосредственно удовлетворить свои потребности. Например, если захочется использовать в паттерн-матчинге регексы, можно сделать свой макрос. Точнее
такой макрос уже сделан.
V>Ооо, очень интересно. Не active patterns, но имеют свои интересные стороны.
Да. Это способ изменить синтаксис, а не подменить паттерны на функции. Это несколько менее функционально, но зато не приводит к потерям производительности.