2011-04-28 19 views

回答

13

的DO-符號的直接​​脫糖給

parseNumber2 :: Parser LispVal 
parseNumber2 = many1 digit >>= (return . Number . read) 

但更地道的方式是使用fmapControl.Applicative

parseNumber2 = Number . read <$> many1 digit 

相當於<$>運營商desugar做-notation:

  1. 翻轉任何<-綁定到右側,並添加>>=和拉姆達抽象

    do x <- a 
        y <- b 
        ... 
    

    變得

    a >>= \x -> 
    b >>= \y -> 
    ... 
    
  2. 對於任何非結合的形式,添加上一個>>右:

    do a 
        b 
        ... 
    

    成爲

    a >> 
    b >> 
    ... 
    
  3. 獨自離開最後一個表達式。

    do a 
    

    成爲

    a 
    

應用這些規則,以你的代碼,我們得到

parseNumber2 = 
    many1 digit >>= \x -> 
    return $ (Number . read) x 

做一些簡化

parseNumber2 = many1 digit >>= \x -> (return . Number . read) x 
parsenumber2 = many1 digit >>= (return . Number . read) 

現在,對於任何單子,fmap<$>可以被定義爲

f <$> x = x >>= (return . f) 

使用此得到慣用形式

parseNumber2 = Number . read <$> many1 digit 
+2

參見(HTTP [RWH#做塊的脫糖]://書.realworldhaskell.org/read/monads.html#monads.do)和[Haskell 2010> Expressions#Do](http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14) – 2011-04-28 17:52:33