5

私は Haskell で Arrows を学習しようとしているので、XML 用の矢印ベースの HXT ライブラリーを使用して単純なアプリケーションを作成しています。HXT wiki とチュートリアルの例では、関数型のシグネチャが省略されています。しかし、私は型がとても好きで、それらをどのように使用するかを考え出そうとしています. ここで、つまずきに出会いました。これらの関数が与えられた場合:

readXml str = runX (readString [withValidate no] str)

atTag tag = deep (isElem >>> hasName tag)

次の署名を割り当てる必要があると思います。

readXml ∷ String → IO [XmlTree]

atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree

私は矢印構文を使用してこれらを一緒にフックしようとしています:

parseItem = proc str -> do
    desc <- text <<< atTag "description" <<< arr readXml -< str
    ...

しかし、もし私の型署名が正しければ (GHC は文句を言っていない)、モナド構文とアロー構文を組み合わせて からXmlTree出て に戻る方法が必要になるだろうIO

進め方がわからない。誰にも洞察がありますか?

4

1 に答える 1

3

"converts"runXの定義で使用すると、矢印が関数に変換され、parseItem の定義で使用すると、その関数が再び矢印に変換されます。さて、このようにすることは問題ありませんが、 (-IO State List Arrow の特別な型エイリアス)を返すことを除いて、これは としてだけでなく、より具体的には;として扱われるべきです。一方、を使用して再ラップすることにより、純粋なものとして扱っています。readXmlarrreadStringIOStateArrowIOSLAArrowIOArrowArrowarr

ここには 2 つのオプションがあります。

  1. を作りreadXml = readString [withValidate no]ますreadXml :: String -> IOStateArrow s b XmlTree... <<< readXml str次に、で行うことができますparseItem
  2. readXml を IO 矢印に持ち上げるために使用arrIOします。これにより、意図したとおりに使用できます。

この場合、オプション 1 を使用します。これは、特別な理由がなければ、この矢印のラッピングとアンラッピングを行うのは不必要に思えるためです。

于 2011-12-12T00:40:19.620 に答える