История изменений
Исправление quasimoto, (текущая версия) :
- Явное или нет подтипирование с рантайм апкастами тоже подойдёт:
{-# LANGUAGE TypeOperators, MultiParamTypeClasses #-} class a <: b where up :: a -> b ($>) :: (a <: c) => (c -> b) -> a -> b ($>) f = f . up -- instance a <: b where -- up = id -- -- ($) :: (a -> b) -> a -> b -- ($) = ($>) instance Either a b <: Either b a where up (Left x) = Right x up (Right x) = Left x test :: Either Int String -> IO () test = either (print . (+ 1)) (putStrLn . (++ "...")) testTest :: IO () testTest = do let x :: Either String Int x = Left "!!!" -- test $ x test $> x
Исходная версия quasimoto, :
- Явное или нет подтипирование с рантайм апкастами тоже подойдёт:
{-# LANGUAGE TypeOperators, MultiParamTypeClasses #-} class a <: b where up :: a -> b ($>) :: (a <: c) => (c -> b) -> a -> b ($>) f = f . up -- instance a <: b where -- up = id -- -- ($) :: (a -> b) -> a -> b -- ($) = ($>) instance Either a b <: Either b a where up (Left x) = Right x up (Right x) = Left x test :: Either Int String -> IO () test = either (print . (+ 1)) (putStrLn . (++ "...")) testTest :: IO () testTest = do let x :: Either String Int x = Left "!!!" -- test $ x test $> x