Стрелки / HXT и тип подписи - PullRequest
5 голосов
/ 12 декабря 2011

Я пытаюсь выучить Arrows в Haskell, поэтому я пишу простое приложение с библиотекой HXT для XML на основе стрелок.Примеры в вики и руководствах по HXT отказываются от сигнатур типов функций.Однако я очень люблю типы и пытаюсь понять, как их использовать.Здесь я встретил камень преткновения.С учетом этих функций:

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,

Я не уверен, как поступить.У кого-нибудь есть идеи?

1 Ответ

3 голосов
/ 12 декабря 2011

Использование runX в определении readXml "преобразует" стрелку в функцию, а использование arr в определении parseItem снова превращает эту функцию в стрелку.Теперь делать это так, как было бы хорошо, за исключением того, что readString возвращает IOStateArrow (псевдоним специального типа для стрелки списка состояний IOSLA - IO), что следует рассматривать не только как Arrow, но иболее конкретно как IOArrow;между тем, вы рассматриваете его как чистый Arrow, перематывая его, используя arr.

У вас есть два варианта:

  1. Make readXml = readString [withValidate no], так что readXml :: String -> IOStateArrow s b XmlTree.Тогда вы можете просто сделать ... <<< readXml str в parseItem.
  2. . Используйте arrIO, чтобы поднять readXml в стрелку ввода-вывода, что позволяет использовать его так, как вы планировали.

Я бы использовал вариант 1 в этом случае, так как кажется, что делать эту развёртывание-развёртывание стрелки излишне, если для этого нет особой причины.

...