2011-12-11 58 views
5

我想學習Haskell中的箭頭,所以我正在用基於箭頭的HXT庫XML編寫一個簡單的應用程序。 HXT wiki和教程中的示例放棄了函數類型簽名。但是,我非常喜歡類型,並試圖解決如何使用它們。這是我遇到了絆腳石的地方。鑑於這些功能:箭頭/ 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沒有投訴),我需要一種方法來將monad語法和箭頭語法結合起來,使XmlTree退出並返回到IO

我不確定如何繼續。任何人有任何見解?

回答

3

readXml的定義中使用runX將箭頭「轉換」爲函數,並且在parseItem的定義中使用arr將該函數再次轉換回箭頭。現在,這樣做可以,但readString返回IOStateArrowIOSLA-IO狀態列表箭頭的一個特殊類型別名)應該被視爲不僅作爲Arrow,但更具體地作爲IOArrow;與此同時,你通過使用arr重新包裝它,將其視爲純粹的Arrow

你這裏有兩種選擇:

  1. readXml = readString [withValidate no],使readXml :: String -> IOStateArrow s b XmlTree。然後你可以在parseItem中做... <<< readXml str
  2. 使用arrIO可將readXml提升爲IO箭頭,從而使您可以按照預期的方式使用它。

我會在這種情況下使用選項1,因爲如果沒有特殊的理由,這看起來是多餘的箭頭包裝解包。

+0

我很困惑。在場景1中,readXml實際上不是一個箭頭,而是一個返回箭頭的函數。如何將它與箭頭語法一起使用,就好像它是一個一樣? – providence

+0

當我複製代碼時,我忘了刪除' - <';現在應該更清楚了。 – dflemstr