tag:blogger.com,1999:blog-654279083390275842.post599467451657918755..comments2024-03-19T12:22:43.654+03:00Comments on Размышлизмы eao197: [prog] Пояснение/дополнение к предыдущему постуeao197http://www.blogger.com/profile/17283739752119445290noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-654279083390275842.post-16887975935713096272012-01-23T13:50:06.160+03:002012-01-23T13:50:06.160+03:00Не, такое не пройдет, это будет как попытка назнач...Не, такое не пройдет, это будет как попытка назначить x два разных значения.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-76013174547898885322012-01-23T13:45:02.676+03:002012-01-23T13:45:02.676+03:00Ну Scheme это как раз отход от императивного лиспа...Ну Scheme это как раз отход от императивного лиспа в сторону функциональщины :)<br />А эрланг да уже как-то исчезает из флеймов.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-67828987771719675272012-01-23T13:43:59.153+03:002012-01-23T13:43:59.153+03:00@Rustam:
А разве там нельзя было бы записать так:...@Rustam:<br /><br />А разве там нельзя было бы записать так:<br /><br />let rec destutter = function<br /> | [] -> []<br /> | x :: [] -> x :: []<br /> | x :: x :: rest -> destutter (x :: rest)<br /> | x :: rest -> x :: destutter rest<br /><br />?eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-44404586607502395322012-01-23T13:43:27.135+03:002012-01-23T13:43:27.135+03:00Даже проще, строка из-за которой сыр бор тут вообщ...Даже проще, строка из-за которой сыр бор тут вообще лишняя:<br /><br />let rec destutter = function<br /> | [] -> []<br /> | x :: y :: rest when x = y -> destutter (y :: rest)<br /> | x :: rest -> x :: destutter rest<br /><br />последняя строка нормально отработает и для одноэлементного списка.<br />В общем подтверждение моего эмпирического правила, стараться не использовать 'if' заменять его паттерн матчингом.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-5347950773214177372012-01-23T13:38:00.778+03:002012-01-23T13:38:00.778+03:00По моему разбор наглядней, особенно если переписат...По моему разбор наглядней, особенно если переписать вариант на окамл вот так:<br /><br />let rec destutter = function<br /> | [] -> []<br /> | x :: [] -> x :: []<br /> | x :: y :: rest when x = y -> destutter (y :: rest)<br /> | x :: rest -> x :: destutter rest<br /><br />практически декларативное описание алгоритма.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-47406144157345122762012-01-23T13:35:39.451+03:002012-01-23T13:35:39.451+03:00допустим, нам надо выкинуть не пары, а все подряд ...<i>допустим, нам надо выкинуть не пары, а все подряд идущие равные элементы, оставив 1</i><br /><br />Примеры выше это самое и делают.Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-46285469454568171662012-01-23T13:24:17.875+03:002012-01-23T13:24:17.875+03:00Да ладно, чой-то я не помню, чтобы евангелисты Erl...Да ладно, чой-то я не помню, чтобы евангелисты Erlang-ом размахивали ;) Erlang уже давно обычная рабочая лошадка (что-то вроде RoR, но в другой нише) на которой тихо и спокойно работают.<br /><br />А вот Scheme -- это вотчина других евангелистов, уже от Lisp-а всемогущего :)))eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-34946400001397385452012-01-23T13:13:47.383+03:002012-01-23T13:13:47.383+03:00@Евгений
Я убежден, что системы типов (т.е. то, чт...@Евгений<br /><i>Я убежден, что системы типов (т.е. то, что ставится во главу угла евангелистами от функциональщины)</i><br /><br />Erlang, Scheme, Pure :)Rustamhttps://www.blogger.com/profile/17746482246614094380noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-21134779875771022462012-01-19T15:51:06.931+03:002012-01-19T15:51:06.931+03:00а вот уу `minus_heading_seq_of` х по-моему наглядн...а вот уу `minus_heading_seq_of` х по-моему нагляднее задавать императивно "пока можно откусить х от уу, делай это!", а не разбором вариантовимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-22098881496048858642012-01-19T14:45:43.370+03:002012-01-19T14:45:43.370+03:00ну или так:
f( [] ) = []
f( [x] ) = [x]
f( x : yy...ну или так:<br /><br />f( [] ) = []<br />f( [x] ) = [x]<br />f( x : yy ) = x : f(yy `minus_heading_seq_of` x)имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-54868005627648548722012-01-19T14:35:57.731+03:002012-01-19T14:35:57.731+03:00хотя, возвращаясь к этому примеру, тут все же гара...хотя, возвращаясь к этому примеру, тут все же гарантия есть<br /><br />допустим, нам надо выкинуть не пары, а все подряд идущие равные элементы, оставив 1<br /><br />мы пишем функцию<br /><br />f( [] ) = []<br />f( [x] ) = [x]<br />f( x : yy ) = x : f(drop_all_equal x yy)<br /><br />и даже без компилятора видим, что разобрали все варианты; пойнт в том, что тут *именно* такой *частный* случай матчинга, когда полнота матчинга гарантирована компилятором (я так надеюсь; я не настролько хаскель знаю, чтобы утверждать)<br /><br />но честно скажу -- я не знаю, какие тесты можно *не писать* к этой функции, поскольку "компилятор гарантирует"имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-53321079407454850902012-01-19T14:18:56.863+03:002012-01-19T14:18:56.863+03:00кстати, точно такую же претензию можно выкатить к ...кстати, точно такую же претензию можно выкатить к нелокальному выводу типов -- совсем не ясно, в каких случаях он гарантированно выловит ошибки, поэтому его помощь сильно обесцениваетсяимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-47149000989045043352012-01-19T14:16:16.350+03:002012-01-19T14:16:16.350+03:00и то, что помощь компилятора значительно обесценив...и то, что помощь компилятора значительно обесценивается, если она не гарантирована в четких и ясных для понимания пределах -- это даимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-84945867793618869162012-01-19T14:14:32.608+03:002012-01-19T14:14:32.608+03:00я понял разницу
однако я считаю полезным в языке ...я понял разницу<br /><br />однако я считаю полезным в языке не только явные гарантии, но и подталкивание программиста к правильному поведению -- в данном случае, к разбору вариантов; при этом полнота разбора вариантов зачастую именно *гарантируется* компиляторомимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.com