Опять про хаскель
May. 6th, 2008 03:25 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Все таки выразительность хаскеля меня убивает. Сидел, размышлял над реализацией 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)
При мысли о том, сколько бы это заняло места на императивных языках без функций высшего порядка, хочется рыдать.
no subject
Date: 2008-05-06 05:15 pm (UTC)no subject
Date: 2008-05-06 06:16 pm (UTC)no subject
Date: 2008-05-06 06:51 pm (UTC)Приходится придумывать, как бы это программы на обычных языках с хаскелем увязать. Задача как раз из разряда "сломать голову всерьез и надолго".
no subject
Date: 2008-05-07 03:10 am (UTC)no subject
Date: 2008-05-07 06:33 am (UTC)no subject
Date: 2008-05-07 06:51 am (UTC)no subject
Date: 2008-05-07 06:54 am (UTC)no subject
Date: 2008-05-07 08:51 pm (UTC)no subject
Date: 2008-05-08 08:42 am (UTC)no subject
Date: 2008-05-11 05:47 pm (UTC)no subject
Date: 2008-05-13 07:15 am (UTC)no subject
Date: 2008-05-07 02:54 am (UTC)С другой стороны, когда я вспоминаю, что на том же прологе в чистом виде попросту невозможно ничего вывести на экран, потому что он не для этого - тоже невесело становится.
Ну и самое плохое то, что почти все языки работают так или иначе в императивных средах (за редкими исключениями типа нейрокомпьютеров и прочей изысканной эксклюзивности). Кстати в приведенном примере, встает замечательный вопрос оптимизации ljoin'ов\rjoin'ов - она тут целиком и полностью отдана на откуп компилятору языка, что есть заведомая жопа на серьезных задачах.
no subject
Date: 2008-05-07 06:33 am (UTC)thanks much
Date: 2008-05-08 11:59 pm (UTC)no subject
Date: 2008-05-29 04:22 pm (UTC)