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




При мысли о том, сколько бы это заняло места на императивных языках без функций высшего порядка, хочется рыдать.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 8th, 2026 07:50 am
Powered by Dreamwidth Studios