metaclass: (Default)
[personal profile] metaclass
Все таки выразительность хаскеля меня убивает. Сидел, размышлял над реализацией inner и outer join в базах данных, решил поэкспериментировать в итоге получилось вот такое:

import Maybe

join :: [a] -> [b] -> (a -> b -> Bool) -> [(a,b)]
join a b predicate = [(ae,be) | ae<-a, be<-b , predicate ae be ]

ljoin :: [a] -> [b] -> (a -> b -> Bool) -> [(a,Maybe b)]
ljoin a b predicate = 
 case a of
  []    -> []
  x:xs  -> ljoin xs b predicate 
           ++
           case [(x,Just be) | be<-b, predicate x be] of 
                []    -> [(x,Nothing)]
                pairs -> pairs

rjoin :: [a] -> [b] -> (a -> b -> Bool) -> [(Maybe a,b)]
rjoin a b predicate = 
 case b of
  []    -> []
  x:xs  -> rjoin a xs predicate 
           ++
           case [(Just ae,x) | ae<-a, predicate ae x] of 
                []    -> [(Nothing, x)]
                pairs -> pairs
--или так
rjoin1 :: [a] -> [b] -> (a -> b -> Bool) -> [(Maybe a,b)]
rjoin1 a b predicate = map flp (ljoin b a flppredicate)
    where flppredicate b1 a1 = predicate a1 b1
          flp (a1,b1) = (b1,a1)




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

Date: 2008-05-06 05:15 pm (UTC)
From: [identity profile] komarov.livejournal.com
мооощь

Date: 2008-05-06 06:16 pm (UTC)
From: [identity profile] kevit.livejournal.com
где-то недавно пробегала статья, общий смысл таков - не программируйте для собственного удовольствия на хаскеле и питоне, потому что больше никогда не сможете программировать за деньги на c#

Date: 2008-05-06 06:51 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Угу, Why learning Haskell/Python makes you a worse programmer
Приходится придумывать, как бы это программы на обычных языках с хаскелем увязать. Задача как раз из разряда "сломать голову всерьез и надолго".

Date: 2008-05-07 03:10 am (UTC)
From: [identity profile] sdfgh153.livejournal.com
Вот чего я, наверное, никогда не пойму, дак это зачем увязывать лопату с веником (:ё

Date: 2008-05-07 06:33 am (UTC)
From: [identity profile] metaclass.livejournal.com
Чтобы одной стороной копать, а другой мести :)

Date: 2008-05-07 06:51 am (UTC)
From: [identity profile] sdfgh153.livejournal.com
И это страшно удобно (:

Date: 2008-05-07 06:54 am (UTC)
From: [identity profile] metaclass.livejournal.com
Альтернатива - взять на работу 10 человек с лопатами, научить их копать, а потом заставить подметать :)

Date: 2008-05-07 08:51 pm (UTC)
From: [identity profile] noop.livejournal.com
Хмм... А будет ли польза от функционального программирования при реализации, скажем, сетевого протокола? :) Ну, где прокручивается в реальном времени массив из DFA, управляемых внешними событиями и внутренними таймерами?

Date: 2008-05-08 08:42 am (UTC)
From: [identity profile] metaclass.livejournal.com
Не знаю, не пробовал :)

Date: 2008-05-11 05:47 pm (UTC)
From: [identity profile] inhate.livejournal.com
для этого существуют низкоуровневые языки.

Date: 2008-05-13 07:15 am (UTC)
From: [identity profile] noop.livejournal.com
Хороший ответ :) На самом деле я не вижу проблем с совмещением подходов... Но только когда функциональные языки достаточно повзрослеют. На LISP писали отличные игрушки для PC и PS2.. А вот на Хаскелле - вряд ли..

Date: 2008-05-07 02:54 am (UTC)
From: [identity profile] molnij.livejournal.com
Дык никто ж не спорит о том, что языки уровня хаскеля, лиспа, питона <продолжите список самостоятельно> отлично решают некоторые задачи. Кстати это же относится и к императивным языкам: паскаль, си, бэйсик, ява <продолжите список самостоятельно>.
С другой стороны, когда я вспоминаю, что на том же прологе в чистом виде попросту невозможно ничего вывести на экран, потому что он не для этого - тоже невесело становится.
Ну и самое плохое то, что почти все языки работают так или иначе в императивных средах (за редкими исключениями типа нейрокомпьютеров и прочей изысканной эксклюзивности). Кстати в приведенном примере, встает замечательный вопрос оптимизации ljoin'ов\rjoin'ов - она тут целиком и полностью отдана на откуп компилятору языка, что есть заведомая жопа на серьезных задачах.

Date: 2008-05-07 06:33 am (UTC)
From: [identity profile] metaclass.livejournal.com
Да, с оптимизацией тут полный абзац. Программу придется трансформировать и считать цену выполнения для каждого варианта.

thanks much

Date: 2008-05-08 11:59 pm (UTC)
From: (Anonymous)
omg.. good work, man

Date: 2008-05-29 04:22 pm (UTC)
From: [identity profile] t-gra.livejournal.com
Что говорить - рулез :)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 8th, 2025 06:44 pm
Powered by Dreamwidth Studios