Mik*_*zel 13 monads haskell syntactic-sugar functor applicative
当我使用Functors,Monads和其他Hakell构造时,如果我的代码不仅仅是几行,我更喜欢使用一些语法糖,如do-notation.这使我更容易遵循代码流程.除了风格偏好之外,使用脱糖块而不是含糖替代品是否有任何真正的优势?
Dan*_*ner 18
我认为人们将这个问题视为愚蠢,这是一种耻辱,特别是因为与这里表达的最强烈的观点相反,答案是肯定的,避免做糖有可能是有利的.Simon Marlow在谈论他正在研究的Facebook Haxl项目时给出了一个很好的例子.这是一个简短的,毫无疑问的屠宰版本 - 绝对看看他的幻灯片了解更多细节!
以下是Facebook可能要运行的查询示例:
numCommonFriends x y = do
fx <- friendsOf x
fy <- friendsOf y
return (length (intersect fx fy))
Run Code Online (Sandbox Code Playgroud)
加糖,这很美.不幸的是,它也是非常顺序的.事实证明,你可以设计一个Monad,使上述成为可能,但是表现不佳,并且以下非含糖的Applicative版本显着提高了性能:
numCommonFriends x y = length <$> liftA2 intersect (friendsOf x) (friendsOf y)
Run Code Online (Sandbox Code Playgroud)
这里的重点是Applicative实例同时运行两个friendsOf分支:静态地清楚第二次调用friendsOf
不能依赖于第一个.这是monadic绑定不能复制的壮举,因为在bind的第二个参数中计算的操作可能取决于第一个参数中的计算结果.
据我所知,设计一种允许这种优化的新型糖是目前一个活跃的研究问题.
好吧没有.糖的全部意义在于它完全脱离了脱落的版本,因此不存在任何非文体优势.你习惯脱糖记号,这样你可以按照它时,它可能是好是风格上更加清晰,但你不会得到任何性能优势或任何东西,因为代码是相同的.