1

我想对以下 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 ) 

任何帮助表示赞赏!

4

1 回答 1

6

嵌套lambdas的do符号去糖,因为(例如)在块的其余部分的范围内,而不仅仅是第一次调用:timedoqcomma

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 开始,如果 (已打开并且) 编译器可以确定没有必要并且更通用的实例具有相同的含义,则该do符号可能会对应用代码脱糖。ApplicativeDo>>=Applicative

于 2016-07-09T18:02:49.070 回答