span
및 splitAt
외의 경우에 pipe-parse 3.0이 어떻게 작동하는지 이해하려고 노력 중이며 작동 방법을 파악할 수 없습니다. 기본 개념은 동형 이성을 가지고 있으며 모든 입력 값을 A
유형에서 B
유형으로 변환하도록 매핑하고 싶습니다. 그런 다음 남은 음식을 B
에서 A
으로 다시 변환하고 싶습니다. pipes-parse
에서 어떻게이 작업을 수행합니까?남은 부분을지도로 유지하기 위해 파이프 구문 분석 사용
비교를 위해, 코드는 conduit
에 다음과 같습니다
import Control.Applicative ((<$>), (<*>))
import Data.Conduit (yield, ($$), (=$=))
import Data.Conduit.Extra (fuseLeftovers)
import qualified Data.Conduit.List as CL
newtype A = A Int
deriving Show
newtype B = B Int
deriving Show
atob (A i) = (B i)
btoa (B i) = (A i)
main :: IO()
main = do
let src = mapM_ (yield . A) [1..10]
res <- src $$ (,,,)
<$> fuseLeftovers (map btoa) (CL.map atob) CL.peek
<*> CL.take 3
<*> (CL.map atob =$= CL.take 3)
<*> CL.consume
print res
편집는 :
(Just (B 1),[A 1,A 2,A 3],[B 4,B 5,B 6],[A 7,A 8,A 9,A 10])
참고 원래가 : 여기 내 위의 코드의 출력이있어, 명확히하기 위해 스트림의 유형은 A
입니다. B
으로 변환하고 첫 번째 요소를 들여다보고 다음 세 요소를 A
유형으로 가져온 다음 B
으로 다음 세 가지를 취하고 마지막으로 나머지를 A
으로 가져옵니다.
명확하게하기 위해 질문이 업데이트되었습니다. 내가 준 예제는 약간 다른 작업을 수행했습니다. 당신이 제공 한 것을 원래의 기능으로 변환하는 것이 사소한 것처럼 보이지만, 나는 할 수 없었습니다. –
마지막 댓글을 긁어서, 알아 냈다고 생각합니다. https://gist.github.com/snoyberg/8888998. 매핑 수를 줄이는 것에 대한 의견을 이해하기 위해 몇 가지 추적 진술을 추가했습니다. 이제 전체 흐름이 앞뒤로 변환 된 것처럼 보입니다. –
@MichaelSnoyman 변환은 앞뒤로'zoom (piso ab) Pp.peek'에서 오는 것으로 보입니다. 중간 부분의 세 요소 만이'atob'을 호출합니다. 예상했던대로. – Davorak