Haskell environment config loader with validation

Haskell
import System.Environment (lookupEnv)
import Text.Read (readMaybe)

data Config = Config { port :: Int, debug :: Bool, appName :: String } deriving (Show)

loadConfig :: IO (Either [String] Config)
loadConfig = do
  portVar <- lookupEnv "PORT"
  debugVar <- lookupEnv "DEBUG"
  nameVar <- lookupEnv "APP_NAME"
  let portR = case portVar >>= readMaybe of
        Just n | n >= 1 && n <= 65535 -> Right n
        _ -> Left ["PORT must be an integer from 1 to 65535"]
      debugR = maybe (Right False) (maybe (Left ["DEBUG must be true or false"]) Right . readMaybe) debugVar
      nameR = maybe (Left ["APP_NAME is required"]) Right nameVar
  pure (Config <$> portR <*> debugR <*> nameR)