There's抽象层,类型为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
的{{1}}实例中的Stream
没有内联?
如果所有这些功能都被内联,或者没有,或Text
和ByteString
是如此不同,我们应该内联一个而不应该内联另一个?
答案 0 :(得分:1)
我猜没有真正的理由。可能没有人注意,
进行基准测试并表明有利于或反对{-# INLINE #-}
。
在a commit from 2011中添加Stream Text
个实例时
它带有{-# INLINE #-}
pragma。
另一方面,Stream ByteString
was touched last time in Feb 2008,
从2008年1月起,前一次提交是初始导入。它没有任何INLINE
pragma
因此,如果您认为有或没有{-# INLINE #-}
pragma的理由
在这些情况下,制作基准来证明你的情况。我不知道有
任何。内联<*>
和>>=
ParsecT
也可能有意义。
相关:我最近添加了一些内联编译指示清晰,因为基准清楚 表明他们有所作为;但是OTOH你不应该把它们撒在一切。