вторник, 14 ноября 2017 г.

О функциональных языках

Познакомился с Haskell.

Многое оказалось знакомо.

До многого оказывается "сам" давно "дошёл".

Для глубины понимания реализовал маленькое подмножество Haskell на своих скриптах.

Чисто в "образовательных целях".

Не для "промышленного применения". По крайней мере пока.

Очень помогают доки собственно по Haskell. Читаю её и делаю "кальку с примеров".

Упоминания тут:
http://programmingmindstream.blogspot.ru/2017/11/blog-post.html?m=1

Чем дальше реализую, тем больше проникаюсь "духом ФЯ".

"Что-то" в этом есть.

Особено в immutable, ленивости и ADT с patternMatching'ом.

Очень полезный ресурс вот:

https://www.ibm.com/developerworks/ru/library/l-haskell4/index.html

Там очень многое подробно объяснется. Дух и буква ФЯ.

Я там много чего полезного почерпнул. И понял как оно "под капотом" устроено.

Ну и про qsort я уже писал:

http://programmingmindstream.blogspot.ru/2017/11/haskell.html?m=1

На Haskell - qsort реально понятнее, чем на C или Pascal.

Ну и:

http://programmingmindstream.blogspot.ru/2017/11/blog-post_22.html?m=1

(+):
http://programmingmindstream.blogspot.ru/2017/11/haskell_1.html?m=1

http://programmingmindstream.blogspot.ru/2017/11/adt.html?m=1



Ссылка. На почитать. #2

https://github.com/leo-yuriev/ioarena/tree/master/src/drivers

Ссылка. На почитать

http://ejdb.org/

четверг, 2 ноября 2017 г.

Просто так. О тестировании

Я вот что писал:

http://18delphi.blogspot.ru/2013/11/gui_9423.html?m=1

Оно не потеряло актуальности.

Что я хотел написать?

Я очень рад тому, что я следую принципам, которые там описаны.

Более того. Я применяю "почти TDD" в "повседневном программировании".

Я пишу код. И если он не слишком тривиален - пишу к нему тест.

Для меня лично - этот подход, более чем оправдывает себя.

У меня уже скопилась немаленькая база тестов. Многие из тестов написаны на скриптах. На скриптах тесты писать в РАЗЫ удобнее, чем на Delphi. На несколько десятичных порядков.

Потому, что в скриптах и инфраструктура развитее и там есть всякие "вкусности" типа лямбд (замыканий), литераторов, "сборки мусора", препроцессинга кода, и "сравнения с образцом", пост- и пред-условий, генерации эталонов, элементов ФЯ, кеширования значений функций, view от array, типа map и filter, а также rules и прочее и прочее и прочее.

Вот я тут начал делать Haskell-подобные вещи:

http://programmingmindstream.blogspot.ru/2017/11/haskell.html?m=1

http://programmingmindstream.blogspot.ru/2017/10/haskell-vs-count.html?m=1

Параллельно пишу тесты. Очень помогает. Ошибки вылазят "практически сразу".

Пишу "минимальный код" к нему тут же пишу "минимальный тест".

И всё срастается.

Собственно тесты и есть "примеры использования кода". Очень всё просто и логично.

Если какие-то ветки кода - не рабочие, то там пишутся assert'ы и они не покрыты тестами.

Как только assert'ы вылазят - дописываются ветки кода и дописываются "тривиальные тесты".

Всё просто и банально. Как 2*2=5.

Код используется - тестируем. Не используется - ставим assert и не тестируем.

Наткнулись на assert - пишем тест и тестируем.

И так "по кругу".

Просто и банально.

Мне лично - нравится.

Никому ничего в то же время не навязываю.

Ну в общем "ни о чём" написал. Хорошо быть "богатым и здоровым".

С коммунистическим приветом. ;)

p.s. Возможно уже стоит опубликовать машинку для тестирования?


Ссылка. ADT

https://ru.m.wikipedia.org/wiki/Алгебраический_тип_данных

Наконец я вроде понял, что это такое...

Там конечно "мудрёно" всё написано. Особенно про pattern-matching.

Всё гораздо проще. Банальное "сравнение кортежей" и сопоставление формальных параметров фактическим.

Я прям готов уже "статью" написать. Типа - "ADT, Haskell, immutable objects и pattern-matching для дебилов из мира императивных языков". Таких как я.

А то блин "морфизм, конструкторы (не такие как в C++), монады/шмонады, хвостовая рекурсия, ленивые вычисления, чанки, функции высшего порядка..."

Всё просто на самом деле объясняется. Для дебилов. Таких как я. Из императивного мира.

Шучу... Куда уж мне сирому...

Даже есть мысли как такое под Delphi устроить.

Не понятно только - надо ли...

Я ведь почему ФЯ "пристально" заинтересовался? А потому, что "понял", что я "двигаюсь в том же направлении". И раз я двигаюсь в том же направлении, то надо посмотреть "как У людей устроено". Посмотрел. Много полезного для себя почерпнул.

Местами даже захотелось попрограммировать на Haskell.

Но это возможно в будущем...

Я уже "очаровывался" языком Objective-C...

Одно могу сказать - "immutable-объекты - это круто!". Даже для императивных языков.

Что интересно... Пока я "въезжал в Haskell" - я нашёл ошибку с "глубокой рекурсией" при освобождении объектов. Которую лет пять не мог найти..

"Американский метод".

"Ищем одну ошибку, находим - другую".


среда, 1 ноября 2017 г.

Повторю ссылку. "О Haskell по-человечески"

https://www.ohaskell.guide/adt.html

ОЧЕНЬ хорошая книга.

И на самом деле не только про Haskell, но и про ADT вообще.

Haskell. Вопрос. Сортировка

А как на Haskell реализуется сортировка списка?

Там же вроде нет "рандомного" доступа к элементу. Учитывая наличие map и filter.

Или я чего-то не понимаю?

Интересует конечно не встроенная функция api, а как это написать самому руками. С указанием собственной функции сравнения элементов.

HaskellВыделить код
1
2
3
4
5
6
quicksort [] = ([]++[])
quicksort (h:t) = 
    let
       left = quicksort [x | x<-(h:t), x<h]
       right = quicksort [x | x<-(h:t), x>h]
    in left++[h]++right

Видимо, вот из этой реалализации очевидно, как передать ф-ю сравнения:

qsort []     = []
  qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

так?

Кстати при "детальном рассмотрении" - даже понятнее, чем qsort на императивных языках. Влево отбираем элементы < x, вправо > x, а x - "посерединке". ;) Ясно и просто ;)

РЕАЛЬНО ПОНЯТНЕЕ, чем qsort на Pascal. Я НАКОНЕЦ реально ПОНЯЛ, как qsort работает.

Да. Да. Реально понятнее.

Декларатив.

?

А что такое <- ?
И что такое in ?