2011-12-11 15 views
5

Estoy tratando de aprender Flechas en Haskell, así que estoy escribiendo una aplicación simple con la biblioteca basada en flecha HXT para XML. Los ejemplos en los wikis HXT y los tutoriales renuncian a las firmas de tipo de función. Sin embargo, soy bastante aficionado a los tipos y estoy tratando de encontrar la manera de usarlos. Aquí es donde he encontrado un obstáculo. Teniendo en cuenta estas funciones:Flechas/HXT y firmas de tipo

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

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

Calculo que deben asignarse las siguientes firmas:

readXml ∷ String → IO [XmlTree] 

atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree 

Estoy tratando de conectar estos juntos utilizando la sintaxis de la flecha como tal:

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

Sin embargo, si mis firmas de mi tipo son correctas (GHC no se ha quejado), necesitaría una forma de combinar la sintaxis de la mónada y la sintaxis de la flecha para obtener el XmlTree y devolverlo al IO.

No estoy seguro de cómo proceder. Alguien tiene alguna idea?

Respuesta

3

Usando runX en la definición de readXml "convierte" una flecha en una función, y el uso de arr en la definición de parseItem convierte esa función de nuevo en una flecha de nuevo. Ahora, hacerlo así estaría bien, excepto que readString devuelve IOStateArrow (un alias de tipo especial para IOSLA - IO State List Arrow), que debe tratarse no solo como Arrow, sino más específicamente como IOArrow; mientras tanto, lo está tratando como un puro Arrow volviéndolo a empaquetar usando arr.

Usted tiene dos opciones aquí:

  1. gane readXml = readString [withValidate no], de manera que readXml :: String -> IOStateArrow s b XmlTree. Luego puede hacer ... <<< readXml str en parseItem.
  2. Use arrIO para levantar readXml en una flecha IO, que le permite usarlo de la manera que deseaba.

Yo usaría la opción 1 en este caso, ya que parece superfluo hacer este desenrollado de envoltura de flecha si no hay un motivo especial para ello.

+0

Estoy confundido. En el escenario 1, readXml no es en realidad una flecha, sino una función que devuelve una flecha. ¿Cómo se puede usar esto con la sintaxis de flecha como si fuera una? – providence

+0

Olvidé eliminar el '- <' cuando copié el código; debería ser más claro ahora. – dflemstr

Cuestiones relacionadas