当我使用Functors,Monads和其他Hakell构造时,如果我的代码不仅仅是几行,我更喜欢使用一些语法糖,如do-notation。这使我更容易遵循代码流程。除了风格偏好之外,使用脱糖块而不是含糖替代品是否有任何真正的优势?
答案 0 :(得分:18)
我认为人们将这个问题视为愚蠢是一种耻辱,特别是因为与这里表达的最强烈的观点相反,答案是是,避免这样做是有利的。糖。 Simon Marlow在他正在研究的talk about the Facebook Haxl project中给出了一个很好的例子。这是一个简短的,毫无疑问的屠宰版本 - 请仔细查看他的幻灯片以获取更多细节!
以下是Facebook可能想要运行的查询示例:
numCommonFriends x y = do
fx <- friendsOf x
fy <- friendsOf y
return (length (intersect fx fy))
加糖,这很美。不幸的是,它也非常顺序。事实证明,你可以设计一个Monad,使上述成为可能,但是表现不佳,并且以下非含糖的Applicative版本显着提高了性能:
numCommonFriends x y = length <$> liftA2 intersect (friendsOf x) (friendsOf y)
这里的一点是,Applicative实例可以同时运行两个friendsOf分支:静态地清楚第二次调用friendsOf
不能依赖于第一个。这是monadic绑定不能复制的壮举,因为在bind的第二个参数中计算的操作可能取决于第一个参数中的计算结果。
据我所知,设计一种允许这种优化的新糖是目前一个活跃的研究问题。
答案 1 :(得分:5)
没有。糖的全部意义在于它完全脱离了脱落的版本,因此不存在任何非文体优势。您可能习惯于使用符合标准的符号,以便在 风格更清晰时可以使用它,但是您不会获得任何性能优势或任何东西,因为代码是相同的。
答案 2 :(得分:1)
丹尼尔认为,从表演的角度来看,阿马洛伊从可读性的角度出发反对脱离困境。
我认为,有时候,这种脱落的版本更具可读性,即比较
echo :: IO ()
echo = do
ln <- getLine
putStrLn ln
到
echo :: IO ()
echo = putStrLn =<< getLine