去糖做符号

de sugaring do notation

我想把下面的符号脱糖。但我不确定我是否做对了:

是:

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 ) 

感谢任何帮助!

do 表示法将 嵌套 lambda 脱糖,因为(例如)time 在其余 do 的范围内阻塞,而不仅仅是第一次调用 qcomma:

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

应用版本可能有同样的效果,但没有脱糖。

从 GHC 8 开始,do 符号 可能 脱糖到应用程序代码,如果(ApplicativeDo 已打开并且)编译器可以确定 >>= 不是必需的,更通用的 Applicative 实例具有相同的含义。