Entry tags:
Сопоставление с образцом
Не могу понять, почему мейнстримовые языки программирования так открещиваются от паттерн-матчинга? Как не могу понять отсутствие алгебраических типов. Вещи-то очень понятные, логичные и легко реализуемые. В ентих наших дотнетах делают один абстрактный базовый класс и несколько sealed потомков и вуаля. Да и в книжках про паттерны проектирования пишут, что широкие неглубокие иерархии - хорошо, а наоборот - плохо. И, как мне представляется, очень лаконично АТД ложатся на ООП модель, то есть в F#/Nemerle очень удобно, все пользуются, довольные. К тому же енти match'и столько всего умеют, что всякие if/switch/when становятся не нужны. Думаю, любой решивший посмотреть, что там за ФП такое, моментально проникается и потом остро чувствует нехватку и матча и типов-вариантов. Но вот в мейнстриме как-то не, что си-плеяда, что пыхо-плеяда в это не могут, а жаль. И непонятно. Ведь авторы, Хейльсберг какой или Гвидо, должно быть, умнейшие люди, они точно должны быть в курсе про АТД и сопоставление, вещи-то не первой свежести, как и дожны иметь какие-то аргументы, почему "нинужна". Может, кто подскажет, где почитать можно, а то сам ничего внятного найти не смог?
А еще часто пишут, что паттерн-матчинг - енто такой свитч на стероидах. Но, имхо, основная идея матча - разбор структуры и связывавание значений с именами, а свич на стероидах - это друго. Под катом то, как представляю себе енто я. По крайней мере, я ничего лучшепридумать написать на сишарпе не смог, а так хочется.
Я поехал, да?
А еще часто пишут, что паттерн-матчинг - енто такой свитч на стероидах. Но, имхо, основная идея матча - разбор структуры и связывавание значений с именами, а свич на стероидах - это друго. Под катом то, как представляю себе енто я. По крайней мере, я ничего лучше
- var test1 = Switch<int>.Value("xxxx")
- .Case("yyyy", -1)
- .Default(4)
- .Compare();
- Assert.AreEqual(4, test1);
- var test2 = Switch<int>.Value("xxxx")
- .Case(x => x.Length == 4, x => x.Length)
- .Compare();
- Assert.AreEqual(4, test2);
- var test3 = Switch<int>.Value("xxxx")
- .Case<IEnumerable<char>>(s => s.Count())
- .Case(x => x.EndsWith("xx"), 5)
- .Compare();
- Assert.AreEqual(4, test3);
- var test4 = Switch<int>.Value("xxxx")
- .Case("lol", 2)
- .Case(x => x.EndsWith("yxx"), 3)
- .Case<IQueryable>(3)
- .Case<IEnumerable<char>>(s => s.Count())
- .Compare();
- Assert.AreEqual(4, test4);
- var act = Switch<Action>.Value("xxxx")
- .Case("xxx", () => Console.WriteLine("fail"))
- .Case("xxxx", () => Console.WriteLine("win"))
- .Compare();
- act();
no subject