使用>>=表达基本数字解析器

我正在阅读 WikiBook“在 48 小时内为自己编写一个计划”。

Haskell 库 Parsec 用于解析基本表达式,例如数字(如下面的代码所示)。

import Lib
import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment

import Control.Monad

import Data.Typeable ( typeOf )

import Debug.Trace


data LispVal = Atom String 
             | List [LispVal] 
             | DottedList [LispVal] LispVal
             | Number Integer 
             | String String 
             | Bool Bool 
    deriving Show
-- ...
parseNumber :: Parser LispVal
parseNumber = do
                x <- many1 digit
                return $ Number (read x)

书中的一个练习要求读者parseNumber改用>>=符号重写。但是,我不断遇到看起来很可怕的类型不匹配错误。有人可以告诉我如何使用>>=符号重写函数吗?或者至少给我一个提示?

回答

Haskell 报告有一节介绍了do 符号以及如何“脱糖”这些do块。

如果你写一个do块为:

parseNumber = do
    x <- many1 digit
    return (Number (read x))

那么这在语法上等同于:

parseNumber :: Parser LispVal
parseNumber = many1 digit >>= x -> return (Number (read x))

或更优雅:

parseNumber :: Parser LispVal
parseNumber = many1 digit >>= return . Number . read

然而,我们不需要使用>>=. 事实上,如果我们想在将用 构造的项目上应用一个函数Parser,那么我们可以使用fmap :: Functor f => (a -> b) -> f a -> f b(<$>) :: Functor f => (a -> b) -> f a -> f b为此:

parseNumber :: Parser LispVal
parseNumber = Number . read <$> many1 digit


以上是使用&gt;&gt;=表达基本数字解析器的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>