- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习给自己写一个方案,并对 this page 上的练习 4 感到震惊。 .
我该怎么做?我已经走到这一步了,但不知道 readHex
在哪里应该去,我必须liftM
它 ?您的大小写与解析器匹配吗?
parseNumber = liftM (Number . read) $ choice [many1 digit, char '#' >> oneOf "hd" >>= a]
where a f = case f of
'h' -> many1 digit
另外,我不认为你可以申请<|>
在 Parser LispVal
功能,对吧?
最佳答案
I've got this far, but have no idea whatsoever where the readHex is supposed to go, must I liftM it ?
是的,因为 readHex
很可能是一个纯函数并且 liftM
将其提升到 Parser
的单子(monad)上下文中.
因为不太明白你的本地函数是什么a
很好,我暂时离开它并简单地使用函数 parseDecimal
和 parseHex
.在那种情况下,你可以写 parseNumber
像这样:
parseNumber :: Parser LispVal
parseNumber = liftM Number $ parseDecimal <|> parseHex
where parseDecimal :: Parser Integer
parseDecimal = liftM read $ many1 digit
parseHex :: Parser Integer
parseHex = liftM readHex $ char '#' >> ... -- parse hex value
当然你可以省略类型签名,为了清楚起见,我只是添加了它们。
Also, I don't suppose you can apply <|> on Parser LispVal functions, right?
<|>
适用于每个 Parser a
.
我建议阅读一些关于解析器组合器的资料,即 Parsec User Guide .
关于haskell - 将 readHex 添加到 Parsec 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215967/
我正在学习给自己写一个方案,并对 this page 上的练习 4 感到震惊。 . 我该怎么做?我已经走到这一步了,但不知道 readHex 在哪里应该去,我必须liftM它 ?您的大小写与解析器匹配
我是一名优秀的程序员,十分优秀!