2017-03-02 8 views
0

저는 최근 Haskell을 가지고 놀기 시작 했으므로 이것을 이해할 수 없습니다.Haskell은 YAML 파일에서 중첩 된 타임 스탬프를 읽습니다.

data Item= Item{ 
    id :: Integer, 
    kind::String 
    } 

그리고

:이 작업을 수행하여 ID와 종류 완벽하게 벌금을 읽을 수 있습니다 지금까지

id: 1 
kind: good 
created_at: !ruby/object:ActiveSupport::TimeWithZone 
    utc: &1 2017-01-01 10:34:12.533704000 Z 
    zone: &2 !ruby/object:ActiveSupport::TimeZone 
    time: *2 

:이 형식을 가지는 YAML 파일에서 읽어하려고

instance FromJSON Item where 
    parseJSON(Object v) = Item <$> 
     v .: "id" <*> 
     v .: "kind" 

"Data.Yaml"패키지와이 기능을 사용하고 있습니다 :
let items = Data.Yaml.decode ymlData :: Maybe[Item]

그러나 타임 스탬프를받는 방법을 알아낼 수 없습니다.

타임 스탬프를 가져 오는 올바른 방법은 무엇이겠습니까? "utc"만 필요합니다.

+1

첫 번째 문제점은 유형 및 생성자를 대문자로 사용해야한다는 것입니다. 따라서 'data Item = Item ...'및 'Instance FromJSON Item where ...'. 귀하의 질문은 실제로 중첩 된 요소에 액세스하는 방법에 대한 것입니다, 당신이 정말로 물어보고 싶은 것입니까? 이 문제는 타임 스탬프를 얻는 것이 아니라 YAML에서 중첩 된 구조로 작업하는 방법에 관한 것입니다. – bheklilr

+0

@bheklilr 답변 해 주셔서 감사합니다. 네 말이 맞습니다. 질문은 실제로 "중첩 된 요소에 액세스하는 방법"이되어야합니다. – QuickQuestionGuy

+0

[the * yaml * package] (https://hackage.haskell.org/package/yaml-0.8.9/docs/Data-Yaml.html)를 사용하고 있습니까? 그렇다면 질문에서 언급해야합니다. (그런데 설명을 추가하려면 편집 할 수 있습니다.) – duplode

답변

2

가장 쉬운 방법은 을 구현하는 newtype을 만드는 것입니다.

import Data.Time 
import Data.Yaml 

data Item = Item 
    { id :: Int 
    , kind :: String 
    , createdAt :: UTCTime 
    } deriving (Show) 

instance FromJSON Item where 
    parseJSON (Object v) = 
    Item <$> v .: "id" <*> v .: "kind" <*> v .: "created_at" 

newtype Time = Time String deriving (Show, Eq) 

instance FromJSON Time where 
    parseJSON (Object v) = Time <$> v .: "utc" 

희망이 있습니다.

+2

['UTCTime'에는'FromJSON' 인스턴스가 있습니다.] (https://hackage.haskell.org/package/aeson-1.1.0.0/docs/Data-Aeson.html#t:FromJSON), 그리고 그래서'Time'의 정의에서'String'을'UTCTime'으로 대체하는 것만으로도 더 이상 변경할 필요가 없습니다. – duplode

+0

아! 그 점을 지적 해 주셔서 감사합니다. 나는 몰랐다. – Erik

+0

@Erik이 작품은 당신의 도움에 감사드립니다! – QuickQuestionGuy