ネットワーク パケットの attoparsec パーサーの一部である以下のコードを単純化しようとしていますが、それを行うための適切な方法を見つけられません。
atEnd :: IO Bool
解析するものが他にあるかどうかを判断するための への呼び出しから始まります。IO からアンラップしてから if ステートメントで使用するよりも適切な使用方法を見つけることはできませんがatEnd
、モナド内で 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 ペイロードがある場合に戻り、無効なペイロードがある場合にパーサーが失敗することです。
最終的に作成される Packet レコードは次のとおりです。
data Packet = Packet
{ pID :: Integer
, pEndpoint :: String
, pPayload :: Maybe A.Value
}