2016-07-09 6 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)))))) 

실용적 버전이 있습니다 똑같은 효과가 있지만, 아무 것도 내린 것은 아닙니다. GHC 8 시작

, 실용적 코드로 do 표기 desugar은 ( ApplicativeDo가 켜져 있고있다) 경우 컴파일러는 >>=가 필요하지 않으며 더 일반적인 Applicative 인스턴스가 동일한 의미를 가지고 있음을 확인할 수 있습니다.

+0

GHC가 '신청자'에게 좋은 인상을 주었지만 그 이유는 무엇입니까? 그것이 더 잘 수행 될 것이라는 보장은 없습니다, 그렇습니까? – MasterMastic

+1

모나드는'Applicative' 코드에 의해 요구되지 않는 연산 순서를 시행합니다. 이것은 병렬화에 영향을 미칩니다. 사용 가능한 Applicative 인스턴스가'do' 표현식에 적합한 지 여부를 컴파일러가 결정하게함으로써 프로그래머가 불필요하게 모나드로 통근하는 것을 방지 할 수 있습니다. – chepner

+0

ok 대단히 감사합니다 !! 말된다!! – Devitect