stdray: (Default)
[personal profile] stdray
Не могу понять, почему мейнстримовые языки программирования так открещиваются от паттерн-матчинга? Как не могу понять отсутствие алгебраических типов. Вещи-то очень понятные, логичные и легко реализуемые. В ентих наших дотнетах делают один абстрактный базовый класс и несколько sealed потомков и вуаля. Да и в книжках про паттерны проектирования пишут, что широкие неглубокие иерархии - хорошо, а наоборот - плохо. И, как мне представляется, очень лаконично АТД ложатся на ООП модель, то есть в F#/Nemerle очень удобно, все пользуются, довольные. К тому же енти match'и столько всего умеют, что всякие if/switch/when становятся не нужны. Думаю, любой решивший посмотреть, что там за ФП такое, моментально проникается и потом остро чувствует нехватку и матча и типов-вариантов. Но вот в мейнстриме как-то не, что си-плеяда, что пыхо-плеяда в это не могут, а жаль. И непонятно. Ведь авторы, Хейльсберг какой или Гвидо, должно быть, умнейшие люди, они точно должны быть в курсе про АТД и сопоставление, вещи-то не первой свежести, как и дожны иметь какие-то аргументы, почему "нинужна". Может, кто подскажет, где почитать можно, а то сам ничего внятного найти не смог?

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


  1. var test1 = Switch<int>.Value("xxxx")  
  2.                 .Case("yyyy", -1)  
  3.                 .Default(4)  
  4.                 .Compare();  
  5. Assert.AreEqual(4, test1);  
  6.   
  7. var test2 = Switch<int>.Value("xxxx")  
  8.                 .Case(x => x.Length == 4, x => x.Length)  
  9.                 .Compare();  
  10. Assert.AreEqual(4, test2);  
  11.   
  12. var test3 = Switch<int>.Value("xxxx")  
  13.                 .Case<IEnumerable<char>>(s => s.Count())  
  14.                 .Case(x => x.EndsWith("xx"), 5)  
  15.                 .Compare();  
  16. Assert.AreEqual(4, test3);  
  17.   
  18. var test4 = Switch<int>.Value("xxxx")  
  19.                 .Case("lol", 2)  
  20.                 .Case(x => x.EndsWith("yxx"), 3)  
  21.                 .Case<IQueryable>(3)  
  22.                 .Case<IEnumerable<char>>(s => s.Count())  
  23.                 .Compare();  
  24. Assert.AreEqual(4, test4);  
  25.   
  26. var act = Switch<Action>.Value("xxxx")  
  27.              .Case("xxx",  () => Console.WriteLine("fail"))  
  28.              .Case("xxxx", () => Console.WriteLine("win"))  
  29.              .Compare();  
  30. act();  
Я поехал, да?

(no subject)

Date: 2012-09-20 06:28 am (UTC)
From: [identity profile] stdray.livejournal.com
Енумы с аргументами. Интересно. Наверное, оно так даже побыстрее работать будет.
Edited Date: 2012-09-20 06:28 am (UTC)

December 2019

S M T W T F S
1234567
891011121314
15161718192021
222324252627 28
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags