我正在尝试简化以下代码,该代码是网络数据包的 attoparsec 解析器的一部分,但我不知道如何做这件事。
它首先调用以atEnd :: IO Bool
确定是否还有更多要解析的内容。我找不到atEnd
比从 IO 解包然后在 if 语句中使用它更好的使用方法,但似乎必须有一种更简单的方法来检查 monad 中的 bool。这是代码:
maybePayload :: Parser (Maybe A.Value)
maybePayload = do
e <- atEnd
if e then return Nothing
else do
payload' <- char ':' *> takeByteString
maybe mzero (return . Just) (maybeResult $ parse A.json payload')
目的是在Nothing
没有有效负载的情况下返回,Just A.Value
如果有有效的 JSON 有效负载则返回,如果有无效的有效负载则解析器失败。
这是最终创建的数据包记录:
data Packet = Packet
{ pID :: Integer
, pEndpoint :: String
, pPayload :: Maybe A.Value
}