{-# LANGUAGE Haskell2010 #-} module Operators where (+++) :: [a] -> [a] -> [a] [a] a +++ :: forall a. [a] -> [a] -> [a] +++ [a] b = [a] a forall a. [a] -> [a] -> [a] ++ [a] b forall a. [a] -> [a] -> [a] ++ [a] a ($$$) :: [a] -> [a] -> [a] [a] a $$$ :: forall a. [a] -> [a] -> [a] $$$ [a] b = [a] b forall a. [a] -> [a] -> [a] +++ [a] a (***) :: [a] -> [a] -> [a] *** :: forall a. [a] -> [a] -> [a] (***) [a] a [] = [a] a (***) [a] a (a _:[a] b) = [a] a forall a. [a] -> [a] -> [a] +++ ([a] a forall a. [a] -> [a] -> [a] *** [a] b) (*/\*) :: [[a]] -> [a] -> [a] [[a]] a */\* :: forall a. [[a]] -> [a] -> [a] */\* [a] b = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b] concatMap (forall a. [a] -> [a] -> [a] *** [a] b) [[a]] a (**/\**) :: [[a]] -> [[a]] -> [[a]] [[a]] a **/\** :: forall a. [[a]] -> [[a]] -> [[a]] **/\** [[a]] b = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] zipWith forall a. [[a]] -> [a] -> [a] (*/\*) [[[a]] a forall a. [a] -> [a] -> [a] +++ [[a]] b] ([[a]] a forall a. [a] -> [a] -> [a] $$$ [[a]] b) (#.#) :: a -> b -> (c -> (a, b)) a a #.# :: forall a b c. a -> b -> c -> (a, b) #.# b b = forall a b. a -> b -> a const forall a b. (a -> b) -> a -> b $ (a a, b b)