使用 Cassava 和 Attoparsec 解析自定义字段
Parsing custom fields with Cassava and Attoparsec
我有一个 CSV,其中包含我必须解析出的单位值的字段。举个简单的例子:
data EValue = Farads Double | MicroFarads Double | PicoFarads Double
因此我需要解析如下内容:
parseEValue = farads <|> micro <|> pico
where farads = Farads <$> double <* string "F"
micro = MicroFarads <$> double <* string "µF"
pico = PicoFarads <$> double <* string "pF"
如何将此包含在 FromField
的 Cassava
的实例定义中?
instance FromField EValue where
parseField = ???
你只需要在你得到的 Field
上 运行 attoparsec,然后将结果放入 Parser
monad,就像这样:parseField = either fail pure . parseOnly parseEValue
.
为了完整起见,这里是完整的工作代码:
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
import Data.Csv
data EValue = Farads Double | MicroFarads Double | PicoFarads Double
parseEValue = farads <|> micro <|> pico
where farads = Farads <$> double <* string "F"
micro = MicroFarads <$> double <* string "µF"
pico = PicoFarads <$> double <* string "pF"
instance FromField EValue where
parseField = either fail pure . parseOnly parseEValue
我有一个 CSV,其中包含我必须解析出的单位值的字段。举个简单的例子:
data EValue = Farads Double | MicroFarads Double | PicoFarads Double
因此我需要解析如下内容:
parseEValue = farads <|> micro <|> pico
where farads = Farads <$> double <* string "F"
micro = MicroFarads <$> double <* string "µF"
pico = PicoFarads <$> double <* string "pF"
如何将此包含在 FromField
的 Cassava
的实例定义中?
instance FromField EValue where
parseField = ???
你只需要在你得到的 Field
上 运行 attoparsec,然后将结果放入 Parser
monad,就像这样:parseField = either fail pure . parseOnly parseEValue
.
为了完整起见,这里是完整的工作代码:
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
import Data.Csv
data EValue = Farads Double | MicroFarads Double | PicoFarads Double
parseEValue = farads <|> micro <|> pico
where farads = Farads <$> double <* string "F"
micro = MicroFarads <$> double <* string "µF"
pico = PicoFarads <$> double <* string "pF"
instance FromField EValue where
parseField = either fail pure . parseOnly parseEValue