Опять про хаскель
Все таки выразительность хаскеля меня убивает. Сидел, размышлял над реализацией 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
no subject
no subject
Приходится придумывать, как бы это программы на обычных языках с хаскелем увязать. Задача как раз из разряда "сломать голову всерьез и надолго".
no subject
С другой стороны, когда я вспоминаю, что на том же прологе в чистом виде попросту невозможно ничего вывести на экран, потому что он не для этого - тоже невесело становится.
Ну и самое плохое то, что почти все языки работают так или иначе в императивных средах (за редкими исключениями типа нейрокомпьютеров и прочей изысканной эксклюзивности). Кстати в приведенном примере, встает замечательный вопрос оптимизации ljoin'ов\rjoin'ов - она тут целиком и полностью отдана на откуп компилятору языка, что есть заведомая жопа на серьезных задачах.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
thanks much
(Anonymous) 2008-05-08 11:59 pm (UTC)(link)no subject
no subject
no subject