ArrowPlus
この質問はHXTに関するものですが、一般的な概念に当てはまると思い
ます。次のプログラムを検討してください。
module Main (main) where
import Text.XML.HXT.Core
import Control.Monad (void)
main :: IO ()
main = void $ runX $ root [] [foo]
>>> writeDocument [withIndent yes] "test.xml"
foo :: ArrowXml a => a XmlTree XmlTree
foo = selem "foo" [bar >>> bar >>> bar]
bar :: ArrowXml a => a XmlTree XmlTree
bar = this <+> eelem "bar"
に何が保存されるか分かりますtest.xml
か? 私の期待:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar/>
<bar/>
<bar/>
</foo>
私のロジック: 矢印bar
はすべての入力をコピーし、1 つの「バー」要素を追加します (this
アイデンティティ矢印のエイリアスです):
| |
this eelem "bar"
| |
\ /
\ /
<+>
|
したがって、結果は3 つの 'bar' 要素である必要があります (ファミリの矢印は入力を無視し (内容を生成するために使用することはできますが)、新しく作成された要素のみを出力するため、1 つの 'bar' 要素のみになることにbar >>> bar >>> bar
注意してください)。 .eelem "bar" >>> eelem "bar"
mkelem
test.xml
以上のことを踏まえて、プログラム実行後の内容を示します。
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<//>
<bar/>
<bar/>
<bar/>
<bar/>
<bar/>
<bar/>
<bar/>
</foo>
質問:
とは
<//>
?'bar' 要素が 3 つではなく 7 つあるのはなぜですか? この重複の理由は何ですか?
なぜ私が得ると置き換える
bar >>> bar >>> bar
とnone >>> bar >>> bar >>> bar
:
<?xml version="1.0" encoding="UTF-8"?>
<foo/>
none
ゼロの矢印はどこにありますか。ここでは矢印のモノイドを扱いますよね?
none
(≡ zeroArrow
) はその ID である必要があるため、次のようになります。
none <+> eelem "bar"
これは「bar」要素を生成し、後続の呼び出しは 2 つの別の要素を追加する必要があります。しかし、何も得られません!
bar
一度に 1 つの「バー」要素を追加する適切なバージョンの矢印を作成するにはどうすればよいですか?
4つも質問して申し訳ありませんが、関係は深いと思いますので問題ありません。