Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用aeson'的严格yaml解析;Haskell中的泛型解析器_Parsing_Haskell_Yaml - Fatal编程技术网

Parsing 使用aeson'的严格yaml解析;Haskell中的泛型解析器

Parsing 使用aeson'的严格yaml解析;Haskell中的泛型解析器,parsing,haskell,yaml,Parsing,Haskell,Yaml,我正在使用包解析.yaml文件到Haskell数据结构。因为我有相当多的数据对象,所以我使用泛型来避免每次编写“解析器”。这看起来像 instance ToJSON MyData where toJSON = genericToJSON defaultOptions 但是,解析不够“严格”,即解析器会自动忽略.yaml文件中存在的字段,但在数据结构中没有对应关系。如果.yaml文件中存在“未知”键,是否有一种简单的方法可以触发某种错误?此功能在yaml本身中肯定不存在,因为yaml不提供任何

我正在使用包解析.yaml文件到Haskell
数据
结构。因为我有相当多的
数据
对象,所以我使用泛型来避免每次编写“解析器”。这看起来像

instance ToJSON MyData where
 toJSON = genericToJSON defaultOptions

但是,解析不够“严格”,即解析器会自动忽略.yaml文件中存在的字段,但在
数据
结构中没有对应关系。如果.yaml文件中存在“未知”键,是否有一种简单的方法可以触发某种错误?

此功能在
yaml
本身中肯定不存在,因为yaml不提供任何用于派生
ToJSON
FromJSON
实例的代码。据我所知,
aeson
没有提供您所需要的功能。如果为true,则必须手动编写实例。

下面是我为解决此问题而编写的代码的简化版本。使用via
parseJSON=strictParseYaml

import Data.HashMap.Strict (member,insert,keys)

strictParseYaml xs =
 do
  parsed <- genericParseJSON defaultOptions xs
  let diff = minus (keysOfValue xs) (keysOfData parsed)
  return $
   if diff == [] then
    parsed
   else
    error $ "Found unknown keys: " ++ show diff

 where
  keysOfData u = sort $ constrFields $ toConstr u

  keysOfValue :: Value -> [String]
  keysOfValue (Object xs) = sort $ map unpack $ keys xs
import Data.HashMap.Strict(成员、插入、键)
严格解析YAML xs=
做
已解析[字符串]
keysOfValue(objectxs)=排序$map解包$keys xs