2012-04-01 15 views
13

향후 하스켈 버전에서 Data.TextString을 대체하게 될 것이라고 들었습니다. 내가 가지고있는 한 가지 문제점은 (++)이 목록에만 정의되어 있다는 것입니다. 이 명 Text들을 연결하기 위해, 나는 빨리 자세히 사용자됩니다'mappend'가없는 두 개의 Data.Texts를 결합하는 표준 방법

text1 `mappend` text2 

를 사용해야합니다. 이상적으로 Text++을 사용할 수 있기를 원하지만 그렇지 않은 경우 다른 대안이 무엇입니까? 나 자신의 중절 연산자를 정의 할 수는 있지만 표준 방법이 필요하다.

답변

17

GHC 7.4 (어느 포인트 버전인지 모르겠 음)에서 mappend과 똑같이 작동하는 사전 정의 된 <> 연산자가 있습니다. 따라서 말할 수있을 것입니다

text1 <> text2 

그래서 "표준"중온 연산자이지만 모든 곳에서 사용할 수는 없습니다.

+1

이름이 잘못 지정된 연산자입니다. '<>'는 "같지 않음"의 의미를 갖는다. 모든 Monoid에서 작동하도록'++ '를 일반화하는 것이 더 좋았을 것입니다. –

+8

<>가 선택되었습니다. 왜냐하면 이미 monoidal 의미론이있는 예쁜 인쇄 라이브러리와 기존 코드를 손상시키지 않거나 이상한 편향을 가진 가장 눈에 띄지 않는 옵션이 이미 사용 되었기 때문입니다. 반대로 일반화 (++)는 우선 순위 레벨로 인해 꽤 멋진 인쇄 라이브러리를 만드는 방식으로 수행 될 수 없으며, haskell 98 이전에는 또 다른 의미가있었습니다. 지금 mplus를 호출하십시오. 우리가 다른 언어로 의미가있는 것들을 피한다면 우리는 남은 연산자가 없습니다! <<, >>, -,!, %, : 등의 연산자는 모두 다른 언어의 다른 의미를 가지고 있습니다. –

+0

이상한데, 나는 그것을 사용하려하지만 범위 내에 있지 않다 : '<>''. GHC 7.10.3 – klappvisor

1

모든 종류의 모노로이드에는 mconcat을 사용하면됩니다. 아무것도 가져올 필요가 없으며 코드가 훨씬 더 깨끗해 보입니다.

예 :

{-# LANGUAGE OverloadedStrings #-} 

import   Data.Text 

table :: Text 
table = "user" 

fields :: [Text] 
fields = ["id","nickname","password","date","posts","comments"] 

insertquery :: Text -> [Text] -> Text 
insertquery table fields = mconcat 
    ["insert into ",table," (",names,") values (",vals,");"] 
    where 
    names = insertcomma fields 
    vals = insertcomma [singleton '?' | _ <- fields] 
    insertcomma = intercalate (singleton ',') 

결과는이 제공 :

λ> insertquery 테이블 필드

는 "사용자 (ID, 별명, 비밀번호, 날짜, 게시물, 댓글에 삽입) 값 (?,?,?,?,?,?); "

+0

특히'mconcat [...]'이'<>'보다 낫다는 것에 동의 할지는 모르겠다. 두 개 또는 세 개의 값만 결합하면됩니다. 그러나 당신의 예제와 같이 더 큰 연결을 고려할 가치가있는 옵션입니다. – leftaroundabout

관련 문제