怎么用符号写这个?

时间:2011-10-14 15:01:41

标签: haskell

我正在通过“在48小时内为自己写一个计划解释器”,一个练习是使用do notation编写一个函数。这是功能:

parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit

我尝试了以下操作,但这不起作用:

parseNumber2 :: Parser LispVal
parseNumber2 = do digits <- many1 digit
                  return $ liftM $  (Number . read) digits

没关系。我错误地缩进了代码

2 个答案:

答案 0 :(得分:6)

解压缩digits后,您不再需要liftM了。所以它只是:

return $ Number $ read digits

答案 1 :(得分:4)

我跳过#haskell IRC频道并问lambdabot:

11:25 < dmwit> ?src liftM
11:25 < lambdabot> liftM f m1 = do { x1 <- m1; return (f x1) }
11:27 < dmwit> ?src ($)
11:27 < lambdabot> f $ x = f x

(如果你不想问lambdabot,你也可以问Hoogle并点击文档中的源链接。)

所以,让我们填写fm1

liftM (Number . read) $ many1 digit
    ={definition of ($)}
liftM (Number . read) (many1 digit)
    ={definition of liftM}
do { x1 <- (many1 digit); return ((Number . read) x1) }
    ={expand to layout form, eliminate redundant parentheses}
do
    x1 <- many1 digit
    return ((Number . read) x1)

你可以写出六种不同语法美学的变体,但在扩展(.)($)的定义几次之后,这是我的最爱:

    ={definitions of (.) and ($)}
do
    x1 <- many1 digit
    return . Number . read $ x1