2014-05-20 3 views
0

int와 문자열을 사용하는 새로운 유형을 정의한다고 가정합니다. 나는이처럼 정의 알고Haskell에서 알려진 유형으로 구성된 새 유형 정의

data Comp = Comp Int String

그러나이 표기법의 문제는 내가이 형식의 인스턴스가있는 경우 인스턴스의 형태로되어 있다는 것입니다 :

Comp 45 "heloWorld"

그리고 나는 그것을 원하지 않는다. 데이터 타입의 이러한 "매개 변수"(더 많은 레코드 항목과 같이)를 원한다. 예를 들어, 문자로 분리해야한다. 또는 공백 대신 #를 사용하십시오. 그 캐릭터가 아무 것도하지 않기를 바랄뿐입니다. 사용하고 싶은 표기법입니다. 이 경우 45#"hii" 대신 45 "hii"이 필요합니다. 이 작업을 수행하려면 데이터 유형 정의를 어떻게 조정해야합니까? 이 데이터 형식에 대해 연산자를 오버로드 할 계획이므로 예 : 45#"kkk" + 128#"a"은 유효한 연산이어야합니다.

당신은 당신의 생성자에 대한 별칭으로 연산자를 정의 할 수 있습니다
+0

예를 들어 작동하려면 'Comp'에 대해 'Num'을 구현해야합니다. 어떻게 작동해야합니까? – Lee

+0

하지만 오직 '+'만하고 싶다면'<>'대신'Num'대신'Monoid'를 사용하는 것이 좋습니다. – kqr

답변

6

:

data Comp = Comp Int String deriving Show 

(#) :: Int -> String -> Comp 
(#) = Comp 

지금 당신은 당신의 가치 구축 #을 사용할 수 있습니다 : 당신은 중위 데이터 생성자를 정의 할 수 있습니다

λ: 45#"kkk" 
Comp 45 "kkk" 
+2

추가 참고 사항 : [삽입 생성자] (http://www.haskell.org/ghc/docs/7.8.2/html/users_guide/data-type-extensions.html#infix-tycons)를 정의 할 수 있습니다. 하나는 원하지만, 이름은':'로 시작해야합니다. – duplode

+0

불행하게도 연산자 이름을 선택했기 때문에 'MagicQuote' 언어 확장이 활성화되었을 때 작동하지 않습니다. –

+2

@Rhymoid 당신은'MagicHash'를 의미합니다. 그 사이에 공백이 있다면 여전히 작동 할 것입니다 :'45 # "kkk"' – user2407038

4

을하지만, :으로 시작해야합니다. 그래서 :

infix 9 :# 

대신 @의 fjh의 제안의 중위 생성자를 사용하는 약간의 장점은 : 당신이 표기법을하려는 경우 45:#"kkk" + 128:#"a"가 작동

data Comp = Int :# String 

, 당신은 또한 꽉 우선 순위를 가지고 그것을 정의해야 그 자동 Read 파생 Show 인스턴스는 :# 표기법을 사용합니다, 당신은 패턴 일치뿐만 아니라 그것을 사용 할 수 있습니다

thingy (n :# s) = ... 

그건 말하자면, 실제로는 표기법적인 편의 일 뿐이며 @ fjh의 제안도 훌륭하고 일반적으로 사용됩니다.

관련 문제