2013-07-30 3 views
2

나는 화살을 사용하는 하스켈 코드의보다 컴팩트 한 버전을 작성하려고 노력해 왔습니다.prok 및 do 표기법을 사용하려고 할 때 haskell 화살 혼란

xml을 튜플 목록으로 변환하려고합니다.

tx2를 실행하면 [(항목 1, 항목 1, 항목 1, 항목 1, 항목 2, 항목 1, 항목 2, ","p2_2 "])]

코드는 작동하지만 내가하는 것처럼 많은 runLA 호출을 사용할 필요가 없다고 생각할 수는 없습니다. getDesc, getDispgetPlist 각각에 대해 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 표기법으로 변환하지 못한 내용은 무엇입니까?

감사합니다.

+0

'-XArrows'를 사용하고 있습니까? –

+0

@AndrewJaffe : 코드 샘플 상단에 pragma가 있습니다. – Vitus

답변

2

원하는 결과를 얻으려면 거의 HXT 화살표에서 run -function을 여러 번 호출 할 필요가 없습니다. 귀하의 경우 map runLA 대신 listA을 사용하여 화살표에서 결과 목록을 얻을 수 있습니다. /> 연산자를 사용하여 getChildren 호출 중 많은 부분을 개 제거 할 수도 있습니다.

귀하의 proctoTuple의 -version이 나에게 잘 보이는,하지만 난

tx1 = runLA (xread /> hasName "list" /> hasName "item" >>> toTuple) xml 

toTuple = proc tree -> do 
    desc <- aDesc -< tree 
    disp <- aDisp -< tree 
    plist <- aPlist -< tree 
    returnA -< (desc, disp, plist) 


aDesc = getChildren >>> hasName "desc" /> getText 
aDisp = getChildren >>> hasName "display" /> getText 
aPlist = getChildren >>> hasName "plist" >>> listA (getChildren /> getText) 

로 귀하의 예제 코드의 나머지 부분을 다시 것 대신 화살표 표기법을 사용하는 toTuple

로 간단하게 쓸 수있다
toTuple = aDesc &&& aDisp &&& aPlist >>> arr3 (,,) 
+0

대단히 고마워요, 제가하고 싶은 일을 정확하게 이해하고 있습니다. 다시 한 번 감사드립니다. – Chime