2017-02-14 6 views
2

문자열에서 후행 문자 'T'를 제거하고 동시에 관련 문자열을 첫 번째 문자열에서 제거 된 동일한 문자 수만큼 줄이십시오. Haskell Data.ByteString.Lazy.Char8에 압축 해제 기능이없는 이유는 무엇입니까?

{-# LANGUAGE OverloadedStrings #-} 
import qualified Data.ByteString.Lazy.Char8 as C 
zipTrim s q 
    | C.null s = (C.empty, C.empty) 
    | C.head (last $ C.group s) == 'T' = 
     unzip (C.zip (C.concat $ init $ C.group s) q) 
    | otherwise = (s, q) 

는 그러나, unzip 나에게 [Char] 한 쌍의 대신 Bytestring 한 쌍을 반환 다음과 같이

나는 시도했다. https://hackage.haskell.org/package/bytestring-0.10.8.1/docs/Data-ByteString-Char8.html#v:unzip

왜 게으른 버전에 유사한 기능이되지 않습니다 :

비 게으른 버전은 Bytestring 한 쌍을 반환 압축 해제 기능이?

(내 공동 트리밍 문제에 더 나은 솔루션을 제안 주시기 바랍니다. 나는 너무 느린하지 뭔가를하고 싶습니다.) 게으른 bytestrings에 대한 언뜻

+2

아마도 게으른 자음이 얼마나 게으른 지 분명하지 않기 때문일 수 있습니다. 엄격한 bytestrings을 lazy bytestrings로 변환 할 수 있습니다. –

+1

아마도 좋은 이유는 없습니다. 누군가 잊은 것 같아요. http://hackage.haskell.org/package/bytestring-0.10.8.1/docs/src/Data-ByteString-Lazy.html#unzip – jberryman

답변

2

, unzip을 모두 반쪽 pack를 사용하여 아래로 비등 "바이트"목록의 한 쌍의 :하지만 가드를 당신을 잡을 수

import Data.Bifunctor 
import qualified Data.ByteString.Lazy.Char8 as C 

unzipLazy :: [(Char, Char)] -> (C.ByteString, C.ByteString) 
unzipLazy = bimap C.pack C.pack . unzip 

- 리드 바튼 노트로는, "게으른 bytestring이 [입니다] 얼마나 게으른 명확 [그렇지 않다]". 예를 들어,이 ...

print . fst . unzipLazy $ repeat ('a', 'b') 

... 상수 메모리에서 실행되지 않습니다. (덧붙여서, jberryman이 언급 한 기존의 Data.ByteString.Lazy.unzip에서도 마찬가지입니다.) last . C.group은 첫 번째 bytestring을 가져 오므로 게으른 바이트 스트링이 실제로 많은 것을 얻을 수 있는지 확실하지 않습니다. 처음부터 메모리에 저장합니다.