Опять про хаскель
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-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)