我没有在Haskell的经验。我正在尝试.json使用aeson将许多文件解析为Haskell中的数据结构。但是,由于无法控制的原因,我需要将解析数据的文件的名称存储为数据中的字段之一。我到目前为止拥有的一个简单示例是:
data Observation = Observation { id :: Integer
, value :: Integer
, filename :: String}
instance FromJSON Observation where
parseJson (Object v) =
Observation <$> (read <$> v .: "id")
<*> v .: "value"
<*> ????
Run Code Online (Sandbox Code Playgroud)
我的问题是:解析可访问文件名的json文件时,能够序列化数据的智能方法是什么?
我想到的是定义另一个datalike NotNamedObservation,将其初始化,然后具有一个转换函数NotNamedObservation -> String -> Observation(其中String是文件名),但这听起来很糟糕。
谢谢。
只需使您的实例成为从文件路径到观察的函数即可:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.ByteString.Lazy as LBS
import System.Environment
data Observation = Observation { ident :: Integer
, value :: Integer
, filename :: FilePath
} deriving (Show)
instance FromJSON (FilePath -> Observation) where
parseJSON (Object v) =
do i <- read <$> v .: "id"
l <- v .: "value"
pure $ Observation i l
main :: IO ()
main = do
files <- getArgs
fileContents <- traverse LBS.readFile files
print fileContents
let fs = map (maybe (error "Invalid json") id . decode) fileContents
jsons :: [Observation]
jsons = zipWith ($) fs files
print jsons
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |