3
如何使用>> =運算符編寫此函數?如何用>> =運算符編寫以下函數
parseNumber2 :: Parser LispVal
parseNumber2 = do x <- many1 digit
return $ (Number . read) x
如何使用>> =運算符編寫此函數?如何用>> =運算符編寫以下函數
parseNumber2 :: Parser LispVal
parseNumber2 = do x <- many1 digit
return $ (Number . read) x
的DO-符號的直接脫糖給
parseNumber2 :: Parser LispVal
parseNumber2 = many1 digit >>= (return . Number . read)
但更地道的方式是使用fmap
或Control.Applicative
parseNumber2 = Number . read <$> many1 digit
相當於<$>
運營商desugar做-notation:
翻轉任何<-
綁定到右側,並添加>>=
和拉姆達抽象
do x <- a
y <- b
...
變得
a >>= \x ->
b >>= \y ->
...
對於任何非結合的形式,添加上一個>>
右:
do a
b
...
成爲
a >>
b >>
...
獨自離開最後一個表達式。
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
參見(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