我有一个 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
在一个不相关的注释中,
string "µF"
不太可能做你想做的事。您可能想要像 import qualified Data.Text.Encoding as T
和 string (T.encodeUtf8 "µF")
这样的东西。有关详细信息,请参阅通过 IsString 实现 ByteString 文字的令人惊讶的行为。