【问题标题】:de sugaring do notation脱糖符号
【发布时间】:2016-07-09 17:55:39
【问题描述】:

我想对以下 do 表示法进行脱糖。但我不确定我是否做对了:

是:

quote   = do
    time        <- qtime
    qcomma
    ask         <- double
    qcomma
    bid         <- double
    qcomma
    askVolume   <- double
    qcomma
    bidVolume   <- double
    endOfLine
    return $ Quote time ask bid askVolume bidVolume

quote   = Quote <$> (qtime <* qcomma)
                <*> (double <* qcomma)
                <*> (double <* qcomma)
                <*> (double <* qcomma)
                <*> (double <* endOfLine)

相当于:

qtime >>= (\time -> qcomma) 
    >> double 
        >>= (\ ask -> qcomma)  
            >> double  
                >>= (\bid -> qcomma) 
                    >> double
                        >>= (\askVolume  -> qcomma) 
                            >> double
                                >>= (\bidVolume  -> endOfLine)
                                    return (Quote time ask bid askVolume bidVolume ) 

感谢任何帮助!

【问题讨论】:

    标签: haskell applicative do-notation


    【解决方案1】:

    do 符号对 nested lambdas 没有糖分,因为(例如)timedo 块的其余部分的范围内,而不仅仅是对 qcomma 的第一次调用:

    qtime >>= (
      \time -> qcomma
          >> double 
          >>= (\ ask -> qcomma
                   >> double  
                   >>= (\bid -> qcomma 
                           >> double
                           >>= (\askVolume  -> qcomma 
                                        >> double
                                        >>= (\bidVolume  -> endOfLine
                                              return (Quote time ask bid askVolume bidVolume ))))))
    

    applicative 版本可能具有相同的效果,但不会对任何东西进行脱糖。

    从 GHC 8 开始,如果(ApplicativeDo 已打开并且)编译器可以确定 &gt;&gt;= 不是必需的,则do 表示法可能对应用代码脱糖一般Applicative实例含义相同。

    【讨论】:

    • 令人印象深刻的 GHC 会脱糖到 Applicative,但为什么呢?不能保证它会表现得更好,是吗?
    • Monad 强制执行 Applicative 代码不需要的操作顺序,这对并行化有影响。让编译器决定一个可用的 Applicative 实例是否适合 do 表达式可以让程序员从不必要的转换到 monad 中解放出来。
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2018-08-02
    • 2011-10-02
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多