나는 화살을 사용하는 하스켈 코드의보다 컴팩트 한 버전을 작성하려고 노력해 왔습니다.prok 및 do 표기법을 사용하려고 할 때 haskell 화살 혼란
xml을 튜플 목록으로 변환하려고합니다.
tx2를 실행하면 [(항목 1, 항목 1, 항목 1, 항목 1, 항목 2, 항목 1, 항목 2, ","p2_2 "])]
코드는 작동하지만 내가하는 것처럼 많은 runLA 호출을 사용할 필요가 없다고 생각할 수는 없습니다. getDesc, getDisp 및 getPlist 각각에 대해 runLA를 호출합니다.
은 내가
{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
module Test1 where
import Text.XML.HXT.Arrow.ReadDocument
import Text.XML.HXT.Core
xml = "<top>\
\<list>\
\<item>\
\<desc>Item 1</desc>\
\<plist>\
\<p>p1_1</p>\
\<p>p1_2</p>\
\<p>p1_3</p>\
\</plist>\
\<display>Item One</display>\
\</item>\
\<item>\
\<desc>Item 2</desc>\
\<plist>\
\<p>p2_1</p>\
\<p>p2_2</p>\
\</plist>\
\<display>Item Two</display>\
\</item>\
\</list>\
\</top>"
tx1 = runLA (xread >>> getChildren >>> hasName "list" >>> getChildren >>> hasName "item") xml
tx2 = map toTuple tx1
toTuple i = let
desc = getDesc i
display = getDisp i
plist = getPlist i
in (desc, display, plist)
aDesc = getChildren >>> hasName "desc" >>> getChildren >>> getText >>> unlistA
aDisp = getChildren >>> hasName "display" >>> getChildren >>> getText >>> unlistA
aPlist = getChildren >>> hasName "plist" >>> getChildren >>> deep getText
getDesc i = runLA aDesc i
getDisp i = runLA aDisp i
getPlist i = runLA aPlist i
을 단순화 할 표기법을 PROC 및 을 사용할 수 있습니다 생각하지만 TX2를 다시 작성하려고 할 때 다음과 같이 : 그것은 모두에 빠진다
aToTuple = proc tree -> do
desc <- aDesc -< tree
display <- aDisp -< tree
plist <- aPlist -< tree
returnA -< (desc, display, plist)
tx3 = map (\i -> runLA aToTuple i) tx1
을 큰 힙.
proc/do 표기법으로 변환하지 못한 내용은 무엇입니까?
감사합니다.
'-XArrows'를 사용하고 있습니까? –
@AndrewJaffe : 코드 샘플 상단에 pragma가 있습니다. – Vitus