从Haskell中的ByteStrings解析各种整数的通用有效方法

时间:2015-08-28 08:13:02

标签: parsing haskell bytestring

这是我能想到的,但我认为它不是非常有效或安全:

import qualified Data.ByteString.Char8 as B8

convert2Int = read . B8.unpack

有更好的方法吗?我发现库中的函数用于Int类型,但不适用于Int32Int64Word64等其他类型的函数。

2 个答案:

答案 0 :(得分:3)

最简单的方法可能是来自Data.Binary的{​​{3}}:

import qualified Data.ByteString.Lazy as BL
import Data.Binary (decode)

convertToIntegral :: (Binary a, Integral a) => BL.ByteString -> a
convertToIntegral = decode

还有decodeOrFail,如果解码失败,会产生Either值。

P.S。:我如何知道decode适用于您想要的类型?阅读decode

答案 1 :(得分:0)

我找到的另一种方法是使用Attoparsec module

import Data.Attoparsec.ByteString.Char8
import qualified Data.ByteString as B

convertToIntegral :: (Integral a) => B.ByteString -> Either String a
convertToIntegral = parseOnly decimal

当然,这仅适用于没有标志的字符串(不像" -3"和" + 5")。人们可以使用"签名"而不是"十进制"在这些情况下。