我正在通过“在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
没关系。我错误地缩进了代码
答案 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并点击文档中的源链接。)
所以,让我们填写f
和m1
:
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