Сопоставление с образцом
Sep. 20th, 2012 01:41 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Не могу понять, почему мейнстримовые языки программирования так открещиваются от паттерн-матчинга? Как не могу понять отсутствие алгебраических типов. Вещи-то очень понятные, логичные и легко реализуемые. В ентих наших дотнетах делают один абстрактный базовый класс и несколько 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)
Date: 2012-09-19 10:27 pm (UTC)(no subject)
Date: 2012-09-19 10:36 pm (UTC)(no subject)
Date: 2012-09-20 02:59 am (UTC)(no subject)
Date: 2012-09-20 06:28 am (UTC)(no subject)
Date: 2012-09-19 11:10 pm (UTC)В функциональщине pattern matching уже кастрировали, будь то обычные ADT или экстракторы в Scala. По религиозно-историческим причинам.
Там так можно. Но если засунуть подобную реализацию в язык с другой системой типов, то получится switch с кубиком сахара, не более того.
Вспомнить истоки (SNOBOL) и сделать first class patterns _с нативным синтаксисом_ пошло бы на пользу любому языку. Но это сложнее, и пока в современных функциональных языках всё так же херово, как в современном мэйнстриме.
(no subject)
Date: 2012-09-20 07:07 am (UTC)(no subject)
Date: 2012-09-20 08:51 am (UTC)(no subject)
Date: 2012-09-20 09:51 am (UTC)(no subject)
Date: 2012-09-20 10:13 am (UTC)(no subject)
Date: 2012-09-20 03:00 am (UTC)Зря ты так про Гвидо.
(no subject)
Date: 2012-09-20 06:35 am (UTC)(no subject)
Date: 2012-09-20 04:14 pm (UTC)