LINUX.ORG.RU

История изменений

Исправление 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