There’s抽象层由Parsec使用,类型为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 #-}
我想知道内联是否是一个好主意,那么为什么在ByteString的Stream实例中没有内联?
所有这些功能应该是内联的还是没有的,或者Text和ByteString是如此不同,我们应该在一个内联,而不是内联另一个?
解决方法
我想没有真正的理由可能没有人注意,
基准,并表明有利于或反对{ – #INLINE# – }.
基准,并表明有利于或反对{ – #INLINE# – }.
Stream文本实例在a commit from 2011中添加
它带有{ – #INLINE# – } pragma.
另一方面,Stream ByteString was touched last time in Feb 2008,
之前的提交是从2008年1月初始导入.它没有任何INLINE编译指示
所以如果你认为有理由拥有或不拥有{ – #INLINE# – }编译指示
在这些情况下,使基准证明您的情况.我不知道有没有
任何.内联< *>可能是有意义的和>> =也是ParsecT.
相关:我最近添加了很少的内联编译,以清楚,因为基准清楚表明他们有所不同但OTOH你不应该把它们洒在一切上.