如何使用>> =运算符编写以下函数

时间:2011-04-28 12:10:26

标签: haskell monads

如何使用>> =运算符?

编写此函数
parseNumber2 :: Parser LispVal
parseNumber2 = do x <- many1 digit
                  return $ (Number . read) x

1 个答案:

答案 0 :(得分:13)

直言不讳地说明了这种说法

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

但更惯用的方法是使用fmap<$>中的等效Control.Applicative运算符

parseNumber2 = Number . read <$> many1 digit

desugar do-notation:

  1. 将任何<-绑定翻转到右侧并添加>>=和lambda抽象

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

    变为

    a >>= \x ->
    b >>= \y ->
    ...
    
  2. 对于任何非约束性表单,请在右侧添加>>

    do a
       b
       ...
    

    变为

    a >>
    b >>
    ...
    
  3. 保留最后一个表达式。

    do a
    

    变为

    a
    
  4. 将这些规则应用于您的代码,我们得到

    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