2016-07-09 3 views
1

私は砂糖にしたいと思います。しかし、私は右のそれを持っているかどうかイムわからない:ドレッシング表記

されています:

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) 

すべてのヘルプは歓迎です!

答えて

6

time(例えば)qcommadoブロックだけでなく、最初のコールの残りの範囲にあるためdo表記は、ネストさラムダにdesugars:

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

応用的バージョンはかもしれません同じ効果を持ちますが、何にも与えられません。

ApplicativeDoがオンされると)、コンパイラは>>=が必要ではなく、より一般的なApplicativeインスタンスは、同じ意味を持つと判断できる場合GHC 8、応用的コードにdo表記かもしれない desugarから開始。

+0

「Applicative」にはGHCが印象的ですが、なぜですか?それがより良い実行する保証はありません、ありますか? – MasterMastic

+1

Monadは、 'Applicative'コードでは不要な操作の順序を強制します。これは並列化に意味があります。使用可能なApplicativeインスタンスが 'do'式に適しているかどうかをコンパイラが決定するようにすると、プログラマは不必要にモナドに通らなくなります。 – chepner

+0

大変ありがとうございました!それは理にかなっている!! – Devitect