我正在通过在 Haskell 中为自己编写一个计划。它是一个很棒的教程,但我遇到了一个解析练习:
parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit
使用以下方法重写 parseNumber:
- 做记号
- 使用 >>= 运算符的显式排序
我对 do-notation 没有任何问题:
parseNumber :: Parser LispVal
parseNumber = do x <- many1 digit
let y = read x
return $ Number y
对于#2,我尝试了很多变体,例如:
parseNumber :: Parser LispVal
parseNumber = (many1 digit) >>= (liftM (Number . read))
但我一直遇到类型错误。我有两个问题。
- 为什么我会收到类型错误?我误解了单子绑定运算符吗?
- 为什么我的 do-notation 解决方案没有出现类似的类型错误?
我觉得我缺少关于类型的基本概念?