この質問に適切なタイトルを付けるのは非常に難しいです... 私は再び HXT に行き詰まっています。やりたいことは理解できますが、矢印でうまく機能させる方法がわかりません。ここでは、問題を簡単に説明します。
関数foo
は を受け取り、Int
矢印を返します。
foo :: ArrowXml a => Int -> a XmlTree XmlTree
関数bar
はいくつかの属性の値を抽出します:
bar :: ArrowXml a => a XmlTree String
ここで、 s からs へのbaz
マップを取り、矢印を返すように記述する必要があります。String
Int
import qualified Data.Map.Lazy as M
baz :: ArrowXml a => M.Map String Int -> a XmlTree XmlTree
ロジックbaz
: で属性の値を抽出bar
し、マップで検索します。return の場合M.lookup
はJust x
invoke foo x
、それ以外の場合は何もしません (矢印の入力はそのまま通過します)。
私の知る限り、そのような矢印はすべてフィルターとして機能するため、実際にはArrowXml a => a
XmlTree String
type は を取り、XmlTree
(おそらく空の)String
のリストを返すことを意味します。これにより、 のロジックを再定式化できますbaz
。与えられた入力に対してXmlTree
多くの文字列が存在する可能性があり、すべての文字列を使用して整数を検索し、最初に見つかった整数を に渡す必要がありますfoo
。それらの結果がすべて の場合はNothing
、何もしないでください。
ここで私が思いついたもの:
baz :: ArrowXml a => M.Map String Int -> a XmlTree XmlTree
baz m = this &&& (bar >>> arr (`M.lookup` m)) >>> arr (uncurry f)
where f xml Nothing = xml
f xml (Just x) = foo x xml
-- compiler says: ^^^ not so fast, boy
Could not deduce (ArrowXml (->)) arising from a use of ‘foo’
from the context (ArrowXml a)
bound by the type signature for
baz :: ArrowXml a => M.Map String Int -> a XmlTree XmlTree
コンパイラが気に入らないだけでなく、推論も困難です。