2017-03-02 4 views
0

最近ハスケルで遊んで始めたので、これを理解できないようです。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を作成してFromJSONを実装することです。

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

@エリックこの作品は、あなたの助けてくれてありがとう! – QuickQuestionGuy

関連する問題