metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-05-06 03:25 pm

Опять про хаскель

Все таки выразительность хаскеля меня убивает. Сидел, размышлял над реализацией 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)




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

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

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

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

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