Data.Text 대 문자열


80

Haskell 커뮤니티의 일반적인 의견은를 Text대신 사용하는 것이 항상 더 낫다는 것 같지만 String, 유지 관리되는 대부분의 라이브러리의 API가 여전히 String지향적 이라는 사실 은 저를 혼란스럽게합니다. 다른 한편으로, 모두 실수로 간주 하고 모든 지향 함수의 인스턴스를 제공하는 주목할만한 프로젝트 가 있습니다.StringPreludeStringText .

그렇다면 사람들이 String역방향 및 표준 Prelude 호환성과 "스위치 만들기 관성"을 제외하고 계속 지향적 인 API를 작성해야하는 이유가 있습니까? 다른 단점이 있습니까?Text 비해 이 String있습니까?

특히 저는 라이브러리를 설계하고 오류 메시지를 표현하는 데 사용할 유형을 결정하려고하기 때문에 이에 관심이 있습니다.


둘 다 지원하는 것이 얼마나 어려울까요?
Daniel Wagner

6
@Vektorweg 나는 주장합니다. String은 목록의 별칭 일 뿐이 므로 Char모 놀리 식 데이터와 다른 성능 특성을 갖는 것은 당연합니다 Text. 두 유형은 모두 원시적이지 않고 라이브러리에 정의되어 있기 때문에 컴파일러의 관심사가 아닙니다.
Nikita Volkov

1
@DanielWagner 그다지 동기 부여가 아닌 합병증으로 바뀌지 않습니까? 어쨌든 문제는 라이브러리 전체에서 두 유형을 모두 지원하는 공유 패턴이 있다면 일반적인 접근 방식에 관한 것입니다.
Nikita Volkov

3
@Vektorweg Sufficiently Smart Compiler 에 대한 좋은 블로그 게시물이 있습니다 . (방금 GHC도 언급하고 있음을 깨달았습니다.)
kqr 2010 년

1
텍스트로 이동! 미래 세대는 언젠가 문자열 종속 코드 추가를 중단하면 문자열없는 세상에서 혜택을 볼 수 있습니다.
Titou

답변:


31

내 무조건 추측은 대부분의 라이브러리 작성자가 필요 이상으로 종속성을 추가하기를 원하지 않는다는 것입니다. 문자열은 말 그대로 모든 Haskell 배포판의 일부이기 때문에 (언어 표준의 일부입니다!), 문자열을 사용하고 사용자가 해킹에서 텍스트 배포판을 분류 할 필요가 없으면 채택하기가 훨씬 쉽습니다.

대부분의 커뮤니티에서 밤새 전환하도록 설득 할 수없는 경우는 함께 살아야하는 "디자인 실수"중 하나입니다. Applicative가 Monad의 수퍼 클래스가되는 데 얼마나 걸 렸는지 살펴보세요. 상대적으로 사소하지만 많은 변경이 필요했습니다. 그리고 모든 String 항목을 Text로 바꾸는 데 얼마나 걸릴지 상상해보세요.


좀 더 구체적인 질문에 답하려면 Text를 사용하여 눈에 띄는 성능 이점을 얻지 않는 한 String을 사용하겠습니다. 오류 메시지는 일반적으로 다소 작은 일회성이므로 String을 사용하는 것이 큰 문제는 아닙니다.

반면에 당신이 이상주의에 대한 실용주의를 피하는 일종의 이념적 순수 주의자라면 텍스트로 가십시오.


* 문자 목록으로서의 문자열은 기존의 다른 목록 연산 함수와 쉽게 추론하고 통합 할 수있는 깔끔한 속성이기 때문에 디자인 실수를 겁 따옴표에 넣었습니다.


4
그것은 일종의 광신적 인 순결에 관한 것이 아니라 차라리 차라리 최선의 접근 방식의 정체보다는 더 나은 (정말 하나라면) 전환에 기여하는 것입니다. 좋아요, 그래서 당신은 본질적으로 텍스트를 사용하는 데 단점이 없다는 것을 확인합니까?
Nikita Volkov

4
@NikitaVolkov 전환에 기여하고 싶다면 표준을 업데이트하고 기존 라이브러리를 로비 / 변환하는 과정에 참여함으로써 더 큰 변화를 만들 수 있다고 생각합니다. 채택률, 첫 글자에서 패턴 일치를 원하는 사람들, Data.List의 맵 사용 등과 같이 생각할 수있는 것 외에는 사실상 단점이 없습니다.
kqr

6
Data.Text는 오늘날 거의 주어졌고 GHC (요즘 대부분의 사람들이 사용한다고 가정)와 함께 기본 제공되므로 더 이상 중요하지 않을 수 있습니다.
Profpatsch

23

API가 대량의 문자 지향 데이터 및 / 또는 다양한 인코딩을 처리하는 것을 목표로하는 경우 API는 Text를 사용해야합니다 .

API가 주로 작은 일회성 문자열을 처리하는 데 사용되는 경우 내장 문자열 유형 을 사용하는 것이 좋습니다.

많은 양의 텍스트에 문자열 을 사용하면 API를 사용하는 애플리케이션이 훨씬 더 많은 메모리를 소비하게됩니다. 외부 인코딩과 함께 사용하면 API 작동 방식에 따라 사용이 심각하게 복잡해질 수 있습니다.

문자열은 상당히 비쌉니다 (최소 5N 단어, 여기서 N은 문자열의 문자 수). 단어는 프로세서 아키텍처와 동일한 수의 비트입니다 (예 : 32 비트 또는 64 비트) : http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html


11
ASCII가 그것과 관련이 있다고 생각하지 않습니다. String과 Text는 모두 유니 코드를 동등하게 지원하여 실제 인코딩을 추상화 수준으로 밀어 넣습니다. 두 경우 모두 프로그램의 경계에서만 걱정하면됩니다. 유니 코드 지원은 둘 중에서 선택하기에 좋은 기준이 아닙니다.
Tikhon Jelvis 2013 년

4
당신 은 ASCII StringByteString관련하여 혼동했습니다 .
Nikita Volkov

1
@TikhonJelvis Char문자열의 하나가 단일 유니 코드 문자가 아닌 유니 코드 문자의 일부일 수 있다는 문제가 없습니까? 혼란스럽지 않나요? Data.Text가이 문제를 해결합니까?
João Portela 2014 년

3
@ João Portela : Haskell Char은 Java 또는 C #과 다릅니다 char. 완전한 유니 코드 코드 포인트 (32 비트)입니다.
Tobias Brandt 2014 년

1
32 비트입니까? 저는 항상 16 비트라고 생각했습니다. 정리해 주셔서 감사합니다.
João Portela 2014 년

9

소규모 프로젝트에서 [Char]를 사용하는 이유는 최소한 세 가지입니다.

  1. [Char] 다른 플랫폼에서 다르게 작동하거나 아예 사용할 수없는 외부 포인터, 원시 메모리, 원시 배열 등과 같은 신비한 직원에 의존하지 않습니다.

  2. [Char]하스켈의 링구아 프랑카입니다. 하스켈에서 유니 코드 데이터를 처리하는 '효율적인'세 가지 방법이 있습니다. utf8-bytestring, Data.Text.TextData.Vector.Unboxed.Vector Char, 각각 추가 패키지를 처리해야합니다.

  3. [Char]하나 를 사용하면 []많은 특정 기능을 포함하여 모나드의 모든 기능에 액세스 할 수 있습니다 (대체 문자열 패키지는이를 지원하려고하지만 여전히).

개인적으로 utf16utf8utf32 인코딩의 결점을 결합 하는 동시에 장점이 전혀 없기 때문에 utf16 기반 Data.Text의 haskell 커뮤니티에서 가장 의심스러운 설계 중 하나 라고 생각 합니다.


1
utf16이 열등하다고 생각하는 이유에 대해 더 많은 정보를 제공 할 수 있습니까? 이 답변의 일부일 필요는 없지만 귀하의 입장을 자세히 설명하는 기사 일 수 있습니다.
Wizek

2
@Wizek-합리적으로 일반적인 의견입니다. programmers.stackexchange.com/questions/102205/…를 참조하십시오 .
Jules

5

Data.Text가 항상 Data.String보다 효율적인지 궁금합니다 ???

예를 들어 "cons"는 문자열의 경우 O (1)이고 텍스트의 경우 O (n)입니다. Append는 문자열의 경우 O (n)이고 엄격한 텍스트의 경우 O (n + m)입니다. 마찬가지로,

    let foo = "foo" ++ bigchunk
        bar = "bar" ++ bigchunk

엄격한 텍스트보다 문자열에 대해 공간 효율적입니다.

효율성과 관련이없는 다른 문제는 패턴 일치 (명시적인 코드) 및 게으름 (예측 가능한 문자열의 문자 당, 어떻게 든 게으른 텍스트에 따라 구현 됨)입니다.

텍스트는 정적 문자 시퀀스 및 내부 수정에 분명히 좋습니다. 다른 형태의 구조적 편집의 경우 Data.String에 이점이있을 수 있습니다.


1
성능과 효율성에는 큰 문제가 아닙니다. 문자열 구현은 모든 단일 문자에 대한 노드가있는 연결 목록입니다. 간단한 문자열에 대한 많은 추가 메모리, 캐시 및 조각화입니다.
Justin Meiners 2019

4

나는 String이 남아있는 하나의 기술적 이유가 없다고 생각합니다. 그리고 몇 가지를 볼 수 있습니다.

전반적으로 먼저 텍스트 / 문자열의 경우 최상의 솔루션이 하나 뿐이라고 주장합니다.

  • 현악 연주는 나쁘다, 모두가 그것에 동의한다

  • 텍스트는 사용하기 어렵지 않습니다. 문자열에서 일반적으로 사용되는 모든 함수는 텍스트에서 사용할 수 있으며 문자열 컨텍스트 (대체, 패딩, 인코딩)에서 더 유용합니다.

  • 두 가지 솔루션을 사용하면 모든 기본 함수가 다형성이 아닌 경우 불필요한 복잡성이 발생합니다. 증명 : 자동 변환에 대한 질문 이 있습니다 . 그래서이 입니다 문제는.

따라서 하나의 솔루션은 두 가지보다 덜 복잡하며 String의 단점으로 인해 결국 사라질 것입니다. 빠를수록 좋다 !


1
정말 그렇게 간단하지 않습니다. 주위에 디자인되어 String있고 Text.
dfeuer 17.01.06

@dfeuer 나는 포인터에 매우 관심이있을 것입니다-나는 그러한 경우에 대한 직접적인 경험이 매우 부족합니다.
Titou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.