Haskell desugaring的任何优势?

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的第二个参数中计算的操作可能取决于第一个参数中的计算结果.

据我所知,设计一种允许这种优化的新型糖是目前一个活跃的研究问题.

  • 好吧,我对OPs问题的解释是将符号与其desugared等价物进行比较,这类似于`friendsOf x >> =(\ fx - > friendsOf y >> =(\ fy - > return(length(intersect fx) fy))))`据我所知(或者可能是使用`liftM2`的更好的变体).我必须承认,你的解释给出了一个更有趣的观点.我仍然不确定这是OP意味着什么,但是我们不仅仅是帮助人们,而是记录知识,这绝对是Haskell程序员应该注意的事情. (4认同)

ama*_*loy 5

好吧没有.糖的全部意义在于它完全脱离了脱落的版本,因此不存在任何非文体优势.你习惯脱糖记号,这样你可以按照它时,它可能是好风格上更加清晰,但你不会得到任何性能优势或任何东西,因为代码是相同的.