2

(符号なし 8 ビット整数)Parsecを表すテキストをデコードするために、次のコードを作成しました。Word8

decOctetP = try e <|> try d <|> try c <|> try b <|> a
    where
        a = fmap (:[]) digit
        b = do
            m <- oneOf "123456789"
            n <- digit
            return [m, n]
        c = do
            char '1'
            m <- count 2 digit
            return ('1':m)
        d = do
            char '2'
            m <- oneOf "01234"
            n <- digit
            return ['2', m, n]
        e = do
            string "25"
            m <- oneOf "012345"
            return ['2', '5', m]

これを行う簡単な方法があると感じずにはいられません。誰かが私を啓発できますか?

4

3 に答える 3

1

cdおよびeを次のように置き換えることができます。

decOctetP = try c <|> try b <|> a
where
    a = fmap (:[]) digit
    b = do
        m <- oneOf "123456789"
        n <- digit
        return [m, n]
    c = do
        m <- (:) <$> oneOf "123456789" <*> count 2 digit
        guard $ combine m <= 255
        return m
    combine = foldl' (\r d -> 10 * r + (ord d - ord '0')) 0

まだあまりきれいではありませんが、少し短くなっています。

于 2013-11-04T18:11:01.620 に答える