metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2007-12-14 02:10 pm

Душа настоятельно требует

Вставить эту конструкцию

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

в документацию по бухгалтерской системе и сказать ИТ-отделу клиентов, что для реализации бухгалтерских расчетов используется Haskell. И что система отдается им на сопровождение.

Вообще есть мысль найти какой-нибудь встраиваемый функциональный язык и впихнуть его туда в качестве языка для составления отчетов. А то некоторые вещи на SQL ложаться плохо, а если в императивном стиле писать - дико бесят. А так были бы кортежи, паттерн-matching, всякие там map да filter да fold - сиди безумствуй в свое удовольствие.

[identity profile] metaclass.livejournal.com 2007-12-14 12:25 pm (UTC)(link)
Кстате, хотелось бы знать как Хаскелл такую конструкцию оптимизирует и оптимизирует ли вообще.

[identity profile] sergiej.livejournal.com 2007-12-14 01:17 pm (UTC)(link)
Мой моск отравленный жабой отказывается даже понимать такую магию :) Тупею

[identity profile] ktn-zoidberg.livejournal.com 2007-12-14 03:35 pm (UTC)(link)
бери любой .NET совместимый.... а стоп... у тяж дельфи... ну тогда можно Lua или Python

[identity profile] slonopotamus.livejournal.com 2007-12-14 07:19 pm (UTC)(link)
А не могли бы вы на питоне переписать? :) Очень хочется понять, но не получается.

[identity profile] metaclass.livejournal.com 2007-12-14 08:47 pm (UTC)(link)
Да это просто сортировка списка на хаскеле. Функция описывается в виде двух вариантов ответов:
Первая строка означает что сортированный пустой список [] это пустой список.

А вторая - что непустой список разделяется на его голову x и остаток xs , потом остаток фильтруется на два списка - элементы больше головы, элементы меньше головы, полученные списки сортируются вызовом той же функции, из полученных трех частей собирается результат: (отсортированные элементы меньше головы), (голова), (отсортированные элементы больше или равно чем голова).
filter - функция отображающая список на список с помощью переданного ей предиката, а предикат представлен в виде (< x) или (>= x).

В итоге получается рекурсивная сортировка, только вот я не знаю, сумеет ли хаскел оную рекурсию оптимизировать. И вообще не знаю, работает ли это, ибо увидел в комментариях в ru_programming к посту про то, что if не нужен :)

[identity profile] x-a-e-p.livejournal.com 2007-12-14 11:52 pm (UTC)(link)
Это пример из любой книжки/туториала по хаскелю.(metaclass: в Душкине был в самом начале) А вообще, вопрос как это дело оптимизируется очень интересен.

[identity profile] metaclass.livejournal.com 2007-12-15 01:00 am (UTC)(link)
Угу, кажеццо был. Только когда я книгу первый раз читал, у меня еще крыша недостаточно поехала, чтобы такие конструкции осознавать. А сейчас я узреваю в ней великую мощь, которую можно обрушить на несчастные головы ИТ служб клиентов :)

[identity profile] x-a-e-p.livejournal.com 2007-12-15 01:08 am (UTC)(link)
Так наоборот, такая конструкция должна восприниматься на ура непоехавшей крышей с математическим складом ума :)

[identity profile] slonopotamus.livejournal.com 2007-12-15 11:29 am (UTC)(link)
Понятно, спасибо.

Вот из-за этого небось хаскел и не получает распространения. Если даже обычная сортировка записывается настолько сложной для чтения конструкцией, то боюсь даже представить, что получается в более сложных случаях...

[identity profile] metaclass.livejournal.com 2007-12-15 11:34 am (UTC)(link)
Не, это еще простая конструкция совсем. Вот там есть концепция монад - вот на ней я что-то мозг себе сломал, придется опять книгу перечитывать.

[identity profile] -darkus-.livejournal.com 2007-12-15 04:54 pm (UTC)(link)
Я тебе говорил, купить книжку, а ты не послушал. Вон, Павел Алексеевич купил, теперь в ус не дует...

[identity profile] pete-by.livejournal.com 2007-12-15 02:40 pm (UTC)(link)
интересно кто потом все это счатье будет поддерживать? ;-)

[identity profile] metaclass.livejournal.com 2007-12-15 03:49 pm (UTC)(link)
Вот ОНИ (ака мазгаклосты из ИТ служб клиентов) и будут! А я на это посмотрю.