Haskell linux上的yaml库不';t解码它的内容';s编码

Haskell linux上的yaml库不';t解码它的内容';s编码,haskell,yaml,Haskell,Yaml,解码/编码: yDecode :: FromJSON iFromJSONable ⇒ FilePath → IO iFromJSONable yDecode fnm = do ymlData ← BS.readFile fnm return $ fromMaybe (error "Can't parse from YAML") (decode ymlData) yEncode :: ToJSON iToJSONable ⇒ FilePath → iToJSONable → IO() y

解码/编码:

yDecode :: FromJSON iFromJSONable ⇒ FilePath → IO iFromJSONable
yDecode fnm = do
  ymlData ← BS.readFile fnm
  return $ fromMaybe (error "Can't parse from YAML") (decode ymlData)

yEncode :: ToJSON iToJSONable ⇒ FilePath → iToJSONable → IO()
yEncode fnm dat = BS.writeFile fnm $ encode dat

我用这个编码创建了配置,它创建得很好,但是当我阅读它时,我得到了这个错误:
无法从YAML进行解析
-在windows上,相同的代码工作正常,我只是不明白可能有什么错?

什么都没有的情况下,最好使用
decodeother
/
decodeother'
获取更多信息。任一值的左侧都将包含一条错误消息,告诉您故障发生的位置。如果切换,您将看到解析失败,原因是
错误“无法从YAML解析存储库”
行(请参阅下面的
attempt1
)。它遇到的不仅仅是一个物体

然后最好通过解码到我们知道必须成功的类型——Value,来了解YAML包到底解码到了什么。解码时,我们得到以下结果(请参见下面的
attempt2
):

根数据结构似乎是数组而不是对象。有很多方法可以解决这个问题,我选择了一个很有技巧的方法

parseJSON (Array array) = parseJSON (array ! 0)
这使程序工作!我把代码贴在下面。(对于使用lens表示歉意;我使用它在字符串和bytestring之间进行转换,以获得类似这样的快速脚本。没有它,您的程序当然可以正常工作。)

{-#语言重载字符串}
模块库在哪里
进口管制.镜头
导入数据.ByteString
导入Data.ByteString.Lens
导入数据。矢量
导入数据.Yaml
数据存储库=存储库
{location::String
,任务::字符串
,分支::[字符串]
,上游::字符串
,enabled::可能是Bool
可能是布尔
可能是布尔
可能是布尔
,postRebuild::Maybe[String]
,syncGroup::可能是字符串
,hash::可能是字符串
}推导(显示,等式)
来自JSON存储库的实例,其中
parseJSON(对象v)=存储库
v.:“地点”
v.:“任务”
v.:“分支机构”
v.:“上游”
v.:?“启用”
v.:?“根”
v.:?“积极的”
v.:?“干净”
v.:?“重建后”
v.:?“组”
v.:?“散列”
parseJSON(数组)=parseJSON(数组!0)
原始::字符串
原始=未线[
“-组:空”,
“分行:”,
“-主人”,
“哈希:null”,
“清除:空”,
“地点:/home/gentoo haskell”,
“已启用:空”,
“root:null”,
“重建后:空”,
“上游:上游主节点”,
“任务:重设基础”,
“正:空”]
attempt1::ParseException存储库
attempt1=DecodeOr'(原始包装)
attempt2::ParseException值或
attempt2=DecodeOr'(原始包装)

也许这是一个愚蠢的行尾问题——YAML文件是什么样子的?您可以尝试将其复制并粘贴到新文件(在linux上)并重试吗?@Carsten复制和粘贴即使我从windows复制配置也不起作用,但确实
[]
config可以工作/btw目前不确定,但看起来windows正在使用
LF
,linux正在使用
CRLF
那里:S
[]
作为空文件。。。如果你不告诉我们更多关于文件和你最终解码的类型的细节,那真的很难说into@Carsten[]是空的yaml配置。这是粘贴文件和配置我的实际错误有
未能解析字段启用:预期为Bool,遇到Null
,我仍然不确定原因是什么:/bug with maybies?-应该是相关的,但目前还不能深入实际问题
parseJSON (Array array) = parseJSON (array ! 0)
{-# LANGUAGE OverloadedStrings #-}

module Lib where

import Control.Lens
import Data.ByteString
import Data.ByteString.Lens
import Data.Vector
import Data.Yaml

data Repository = Repository
    { location      :: String
    , task          :: String
    , branches      :: [String]
    , upstream      :: String
    , enabled       :: Maybe Bool
    , root          :: Maybe Bool
    , positive      :: Maybe Bool
    , clean         :: Maybe Bool
    , postRebuild   :: Maybe [String]
    , syncGroup     :: Maybe String
    , hash          :: Maybe String
    } deriving (Show, Eq)


instance FromJSON Repository where
    parseJSON (Object v) = Repository <$>
                           v .:  "location"     <*>
                           v .:  "task"         <*>
                           v .:  "branches"     <*>
                           v .:  "upstream"     <*>
                           v .:? "enabled"      <*>
                           v .:? "root"         <*>
                           v .:? "positive"     <*>
                           v .:? "clean"        <*>
                           v .:? "postRebuild"  <*>
                           v .:? "group"        <*>
                           v .:? "hash"
    parseJSON (Array array) = parseJSON (array ! 0)

raw :: String
raw = unlines [
    "- group: null",
    "  branches:",
    "  - master",
    "  hash: null",
    "  clean: null",
    "  location: /home/gentoo-haskell",
    "  enabled: null",
    "  root: null",
    "  postRebuild: null",
    "  upstream: upstream master",
    "  task: rebase",
    "  positive: null"]

attempt1 :: Either ParseException Repository
attempt1 = decodeEither' (raw ^. packedChars)

attempt2 :: Either ParseException Value
attempt2 = decodeEither' (raw ^. packedChars)