паду ли я, стрелой пронзеный
иль мимо пролетит она...

(ария Ленского)

arrow-программирование

у нас есть функции двух видов:

  • из типа a в тип b
  • из типа a в тип "возможно b"
  • и желание соединять их между собой ...


    import Control.Arrow
    import Control.Monad
    
    ------------
    
    f1 :: Int -> Bool 
    f1 = \x -> if x > 10 then True else False 
    
    m1 :: Int -> Maybe Bool 
    m1 = \x -> Just $ case x of 0 -> True  ;  _ -> False
    
    f2 :: Bool -> Int
    f2 = \x -> if x then 12 else 0
    
    m2 :: Bool -> Maybe Int 
    m2 = \x -> Just $ if x then 100 else 13 
    
    -----------
    
    a1 :: Kleisli Maybe Int Bool 
    a1 = arr f1
    
    a2 :: Kleisli Maybe Bool Int 
    a2 = arr f2
    
    
    k1 :: Kleisli Maybe Int Bool
    k1 = Kleisli m1
    
    k2 :: Kleisli Maybe Bool Int 
    k2 = Kleisli m2
    
    -------------------------
    
    k1a2 = runKleisli $ k1 >>> a2
    
    k1k2 = runKleisli $ k1 >>> k2 
    
    k2k1 = runKleisli $ k2 >>> k1 
    
    k2a1 = runKleisli $ k2 >>> a1 
    
    a1a2 = runKleisli $ a1 >>> a2 
    
    a1k2 = runKleisli $ a1 >>> k2
    
    a2a1 = runKleisli $ a2 >>> a1 
    
    a2k1 = runKleisli $ a2 >>> k1
    

    лепота! - молвил царь
    и ответили все - лепота!