私はちょうどhaskellを学んでいて、すべての人が怖いモナドでさえも大したことではないようです。しかし、私は実際の練習的なものにまったく乗り遅れることはありません。jsonデータover map haskell
haskellの最初の実用的な仕事は次の通りです: バイナリファイルの形式を記述したJSONがあれば、そのファイルを解析します。
JSONには、番号や文字列としてのエンドポイントを持つリストなどのアソシエートリスト(辞書)のリストを含む深くネストされた構造があります。 まず最初に、他のエンドポイント(jsonsデータ用のファンクタクラスを持つ)をいくつかの文字列を特に数値に変換することができるようにしたいと思います。また、これらのエンドポイントもすべて折り畳むことができればうれしいでしょう。
私は簡単にいくつかのpythonコードを思い付いた。しかし、haskellで遠くまで行くことはできません。 だから、あなたはハズケで何かを実装するためのあなたの提案ですか?ライブラリを最大限に活用し、すべてのものを最初から手書きしないという解決策のアドバイスを聞くことは本当にうれしいことです。
ありがとうございます!
は---私はpythonで持っているものの 例
いくつかのヘルパー関数を追加しました:ネストされたJSONデータに対する
islist = lambda l: isinstance(l, collections.Iterable) and not isinstance(l, (str, bytes))
isdict = lambda d: isinstance(d, collections.Mapping)
isiter = lambda i: islist(i) or isdict(i)
def iterable(d):
if isdict(d):
i = d.items()
elif islist(d):
i = enumerate(d)
else:
raise ValueError
return i
イテレータ:
def nested_iter(nested, f = lambda *args: None):
for key, value in iterable(nested):
if not isiter(value):
f(nested, key)
yield key, value
else:
yield from nested_iter(value, f)
を今、私はいくつかの数字を置き換えることができますキーのリスト:
def list_from_num(d, k):
if type(d[k]) == int:
d[k] = [k]*d[k]
list(nested_iter(typedef, list_from_num))
またはIと同じキー名と他のいくつかのネストされたデータといくつかの文字列を置き換えることができ
def nest_dicts(defs, d, k):
if d[k] in defs.keys():
d[k] = deepcopy(defs[d[k]])
if isiter(d[k]):
list(nested_iter(d[k], partial(nest_dicts, defs)))
list(nested_iter(typedef, partial(nest_dicts, typedef)))
か、単にデータ
list(nested_iter(d))
バイナリを解析すると、もう少し進化しているが、それはより多くの何物でもありませんを平らにすることができますイテレータにもう1つの関数を渡すとして
あなたがしたいことのいくつかの並べ替えの例はいいですが、私はあなたがそう探していると思います['lens'](https://hackage.haskell.org/package/lens)や[' lens-aeson'](https://hackage.haskell.org/package/lens-aeson)のようなメーピングがあります。 – Alec
はい...誰かがすでに私のレンズをお勧めしました。私はまだ勉強していません。ファンクター、アプリケーション、モナド、変圧器をちょっと手に入れました。 haskellで実用的なものを作り始めることを学ぶには非常に多くのものがあります... – aliko
何か簡単に始めたいなら、[aeson'](https://hackage.haskell)を使ってJSONをHaskellのデータにマッピングすることができます.org/package/aeson)。それで、あなたは普通の変換をすることができます。 'lens'ビットはネストされたデータを操作するのが本当にいいです。 – Alec