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-19 10:27 pm (UTC)
wizzard: (фото)
From: [personal profile] wizzard
посмотри на haXe, там как раз ADT изящно замаскированы под стандартные для С-подобных языков типы))

(no subject)

Date: 2012-09-19 10:36 pm (UTC)
From: [identity profile] stdray.livejournal.com
Я в F# и Nemerle смотрел на этот маскарад, или что значит "ADT изящно замаскированы под стандартные для С-подобных языков типы" ?. Вот бы MS притащила варианты в самое сердце своего крового энтерпрайза, чтобы программисты на вижлбэйсик ощутили всю мощь типпов-сум и паттер-матчинга!

(no subject)

Date: 2012-09-20 02:59 am (UTC)
From: [identity profile] thedeemon.livejournal.com
В Нахе зашли не по пути классов с общим предком, а со стороны enum'ов. Вот есть сишные enum'ы, по ним можно делать case. Добавим им аргументов, получился ADT и паттерн-матчинг. Т.е. шажок от мэйнстрима еще короче, а результат тот же.

(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)

(no subject)

Date: 2012-09-19 11:10 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Есть своя специфика.

В функциональщине pattern matching уже кастрировали, будь то обычные ADT или экстракторы в Scala. По религиозно-историческим причинам.
Там так можно. Но если засунуть подобную реализацию в язык с другой системой типов, то получится switch с кубиком сахара, не более того.

Вспомнить истоки (SNOBOL) и сделать first class patterns _с нативным синтаксисом_ пошло бы на пользу любому языку. Но это сложнее, и пока в современных функциональных языках всё так же херово, как в современном мэйнстриме.

(no subject)

Date: 2012-09-20 07:07 am (UTC)
From: [identity profile] stdray.livejournal.com
SNOBOL интересно, но, как я понял (http://www.snobol4.org/docs/burks/tutorial/ch4.htm), он работает он только со строками, для которых есть встроенные функции. Не думаю, что pattern matching из фукциональных языков кастрирован по сравнению со сноболовским.

(no subject)

Date: 2012-09-20 08:51 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
В Сноболе монада есть, а в тупом "switch по ADT" её нет. Это ключевой момент. Добавляем типы, и получаем ядрёные парсеры, более приличный аналог LINQ, etc. Но у людей в головах чаще ADT. А у некоторых из вышеупомянутых, увы, нет даже этого.

(no subject)

Date: 2012-09-20 09:51 am (UTC)
From: [identity profile] stdray.livejournal.com
Я, видимо, не до конца понимаю, хотя бы потому что не знаком со Сбоноблом. На сопоставление передается строка и на выходе получается тоже строка и можно объединять вычисления. Разве тут какой-то принципиально иной случай, по сравнению, например с Maybe монадой в Haskell? По-моему, просто computation expressions для строк встроенные в язык там.

(no subject)

Date: 2012-09-20 10:13 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
Сильно другой случай. На тему не-нативных аналогов в Хаскеле можно посмотреть Parsec.

(no subject)

Date: 2012-09-20 03:00 am (UTC)
From: [identity profile] thedeemon.livejournal.com
> Ведь авторы, Хейльсберг какой или Гвидо, должно быть, умнейшие люди, они точно должны быть в курсе про АТД и сопоставление

Зря ты так про Гвидо.

(no subject)

Date: 2012-09-20 06:35 am (UTC)
From: [identity profile] stdray.livejournal.com
Он не в курсе про АТД и паттерн-матчинг? Быть того не может. Кстати, автор другой модной игрушки, Матц, тоже свич порезал.

(no subject)

Date: 2012-09-20 04:14 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Он плохо понимает и не любит ФП. Погугли его имя и functional programming. И судя по его детищу, умнейшим человеком его называть грешно.

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