Опять про хаскель
Все таки выразительность хаскеля меня убивает. Сидел, размышлял над реализацией 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
С другой стороны, когда я вспоминаю, что на том же прологе в чистом виде попросту невозможно ничего вывести на экран, потому что он не для этого - тоже невесело становится.
Ну и самое плохое то, что почти все языки работают так или иначе в императивных средах (за редкими исключениями типа нейрокомпьютеров и прочей изысканной эксклюзивности). Кстати в приведенном примере, встает замечательный вопрос оптимизации ljoin'ов\rjoin'ов - она тут целиком и полностью отдана на откуп компилятору языка, что есть заведомая жопа на серьезных задачах.
no subject