de sugaring做符号

时间:2016-07-09 17:55:39

标签: haskell applicative 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 ) 

感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

do符号表示嵌套 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 ))))))

应用版本可能具有相同的效果,但不会对任何事情感到害怕。

从GHC 8开始,do表示法可能 desugar to applicative code if(ApplicativeDo打开并且)编译器可以确定>>= isn& #39; t必要且更一般的Applicative实例具有相同的含义。