Почему 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 вы не должны посыпать их всем.