私はNatural Language Processingプロジェクト(およびElixirの学習)に取り組んでおり、データを変換する慣用的な方法を理解することはできません。縮小/折りたたみ時のデータ構造の作成
ドメイン内の細かい部分であなたを退屈させないために、問題をアドレスの解析に転記してみましょう。彼らは他の人を残したままその場でデータ構造を構成するために、関連するトークンを使用して、文字列トークンのリストを考えると
:
# input
["in", "France:", "22", "Rue", "du", "Débarcadère", ",", "75017", "Paris", ",", "France", "where", "they", "are"]
MyModule.process(tokens)
# output
["in", "France:", %Address{
street: "Rue du Débarcadère",
street_number: 22,
zip: 75017,
city: "Paris",
country: "France"
}, "where", "they", "are"]
# input
["in", "the", "USA:", "125", "Maiden", "Lane", ",", "11th", "Floor",
"New", "York", ",", "NY", "10038", "USA", "where", "they", "are"]
# output
["in", "the", "USA:", %Address{
street: "Maiden Lane",
street_number: 125,
floor: 11,
zip: 10038,
city: "New York",
state: "NY",
country: "USA"
}, "where", "they", "are"]
をAddress
構造体の中に一連のトークンを回すには、いくつかの国が必要になります特定のロジック(住所の書式設定のさまざまな方法など)がありますが、これは利用可能です。さらに、トークン(「:」で終わるトークンなど)を調べることで、適切な構文解析ロジック(つまり、住所が入っている国)に切り替えることができるとします。
もう一度、私は何を達成しようとしている:
- トークンを超える反復1は、特殊なケース(続く国の名前を「:」)トリガするまで
- すると、関連するすべてのトークン(プロセストークンを消費最初の例では、「フランス」を「22」)から
- は、構造体(
%Address{}
) - は、最初の未処理トークンに反復継続(「」)
reduce
のいくつかの形式が適切と思われるが、私はそれをしたい場所reduce
自体は反復継続しないだろう、とreduce_while
はいずれかのチケットではないようです...
そして、それは行うべきではありません違いが、私は、例えば、より高いレベルで同じロジック/プロセスを適用することができ、より高いレベルのデータ構造を構成したいと思います:あなたはこのためStream.unfold/2
を使用することができます
# input
["the", "Mirabeau", "restaurant", "at", %Address{...}, "where", "he", "cooked"]
# output
["the", %Place{
name: "Mirabeau",
type: :restaurant,
location: %Address{...}
}, "where", "he", "cooked"]