gpt4 book ai didi

haskell - 将 readHex 添加到 Parsec 解析器

转载 作者:行者123 更新时间:2023-12-04 03:10:16 24 4
gpt4 key购买 nike

我正在学习给自己写一个方案,并对 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很好,我暂时离开它并简单地使用函数 parseDecimalparseHex .在那种情况下,你可以写 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com