如何使用>> =运算符?
编写此函数parseNumber2 :: Parser LispVal
parseNumber2 = do x <- many1 digit
return $ (Number . read) x
答案 0 :(得分:13)
直言不讳地说明了这种说法
parseNumber2 :: Parser LispVal
parseNumber2 = many1 digit >>= (return . Number . read)
但更惯用的方法是使用fmap
或<$>
中的等效Control.Applicative
运算符
parseNumber2 = Number . read <$> many1 digit
desugar do-notation:
将任何<-
绑定翻转到右侧并添加>>=
和lambda抽象
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)
现在,对于任何monad,fmap
或<$>
都可以定义为
f <$> x = x >>= (return . f)
使用此方法获取惯用形式
parseNumber2 = Number . read <$> many1 digit