Почему Parsec uncons явно встроен в Text, но не ByteString?

Существует слой абстракции, используемый Parsec, type class Stream, он выглядит следующим образом:

class (Monad m, ShowToken t) => Stream s m t | s -> t where
  uncons :: s -> m (Maybe (t, s))

instance (Monad m, ShowToken t) => Stream [t] m t where
  uncons []     = return Nothing
  uncons (t:ts) = return $ Just (t, ts)
  {-# INLINE uncons #-}

instance Monad m => Stream CL.ByteString m Char where
  uncons = return . CL.uncons

instance Monad m => Stream C.ByteString m Char where
  uncons = return . C.uncons

instance Monad m => Stream T.Text m Char where
  uncons = return . T.uncons
  {-# INLINE uncons #-}

instance Monad m => Stream TL.Text m Char where
  uncons = return . TL.uncons
  {-# INLINE uncons #-}

Интересно, здесь хорошая идея, почему почему uncons в ByteString экземпляре Stream не указано?

Должны ли все эти функции быть встроенными или ни одна из них, или Text и ByteString не настолько различны, что мы должны вставить один и не должны встраивать другую?

Ответы

Ответ 1

Я думаю, что нет реальной причины. Вероятно, никто не обратил внимания, сравнивали и показывали, что есть преимущество или против {-# INLINE #-}.

Когда Stream Text экземпляры были добавлены в фиксация из 2011 он пришел с {-# INLINE #-} прагмой.

С другой стороны, Stream ByteString был затронут в последний раз в феврале 2008 г., с предыдущим фиксацией будет начальный импорт с января 2008. У него не было INLINE pragmas

Итак, если вы считаете, что есть причина иметь или не иметь {-# INLINE #-} прагмы в этих случаях сделайте тесты, подтверждающие ваше дело. Я не знаю, что есть Любые. Возможно, имеет смысл встраивать <*> и >>= тоже, ParsecT.

Related: Недавно я добавил несколько встроенных прагм, чтобы понять, потому что тесты показать, что они делают разницу; но OTOH вы не должны посыпать их всем.