나는

2010-12-03 4 views
6

나는 다음과 같은 구조의 재귀 데이터 형식을 선언했습니다 "/" "라는 이름의 값 생성자를 가질 수 나는 GET /"controller"/"action"처럼 귀여운 표정에서 그것을 중위 수 있습니다 그러나, 나는 그렇게하려고하면 :.나는

import Prelude hiding ((/)) 
infixr 5/
data Path = GET | POST | Path/String 

을 ... 나는 얻을이 :

Path.hs:4:30: parse error on input `/' 

:/ 또는 :으로 시작하는 다른 특수 문자 시퀀스로 바꿔도 동일한 세 줄이 올바르게 컴파일됩니다.

그래서 가치 생성자의 이름을 지정할 수있는 방법이 있습니까 /? 나는 별도의 기능이 바로 그것 Slash의 이름을 지정하고 다음 선언 할 수 있다는 사실을 알고 :

(/) :: Path -> String -> Path 
(/) = Slash 

을 ...하지만 그와 같이 나에게 패턴 일치를 못하게 :

request :: Path -> String 
request path = case path of GET /"hello" -> "Hello!" 
          GET /"goodbye" -> "Goodbye!" 

답변

11

짧은 답변 : 제

긴 대답 : 유형 클래스, 유형 이름, 데이터 생성자 (대문자 또는 콜론 중 하나로 시작해야합니다 일부를 이 경우 언어 확장을 사용해야합니다.) 그 밖의 모든 문자는 소문자 또는 다른 허용되는 기호로 시작해야합니다.

일반적으로 소문자 식별자 인 변수은 동일한 규칙을 따르고 콜론으로 시작하지 않습니다.

입력 연산자를 사용하는 경우 the GHC user's guide도 참조하십시오. 데이터 생성자는 항상 허용됩니다.

개인적으로, 귀하의 경우에는 (:/)을 사용합니다. 그렇게 나쁘지는 않지만 잠시 후 콜론을 무시하는 데 익숙해집니다. 어떤 사람들은 후행 콜론을 좋아합니다. 특히 어떤면에서는 데이터가 "대칭"인 경우입니다.

+17

내 코드 전체에 ': /'이 표시되는 것은 저에게 왜 그렇게 실망했는지 궁금하게 만듭니다. – zinglon

+0

@zinglon : Hrhrhrhrhr. 다행스럽게도 영숫자가 아닌 유니 코드 문자 모양의 문자는 연산자에서 사용할 수 있으므로 이모티콘 가능성은 거의 무한합니다. 특히 접두사를 사용하는 것과 같은 괄호로, 당신이 그렇게 할 수있는 모든 교대 - JIS 쓰레기를 상상해보십시오! –

+6

게다가, 하스켈에 관한 좋은 점 중 하나는 코드가 왜 당신에게 실망 스러운지 궁금하지 않아도된다는 것입니다. GHC가 그것에 대해 모두 알려줄 것입니다. –

2

을 나는 모든 생성자 생각 운영자는 콜론으로 시작해야하지만 (틀릴 수도 있습니다).

그래서 당신은 할 수 :

data Path = GET | POST | Path :/ String 
6

아니요,이 작업을 수행 할 수 없습니다. 순수한 Haskell 98에서는 사용자 정의 형식 이름과 생성자가 영숫자이고 대문자로 시작해야합니다. 이것은 in section 4.1.2 of the Haskell 98 Report입니다. GHC에서는 영숫자 이름을 가진 사용자 정의 생성자가 대문자로 시작해야하므로 연산자 인 사용자 정의 생성자는 :으로 시작해야합니다. (사용자 정의 형식 이름도 마찬가지입니다.)이 내용은 section 7.4.2 of the GHC manual에 설명되어 있습니다. 나는 /의 유무에 관계없이 아마도 :/, 나 자신을 사용할 것입니다.


1 :은 "사용자 정의"자격에 대한 이유가 있다는 것입니다 몇 가지 내장 예외 : 유형으로 등 ->, [], () 및 튜플 형식 (,), (,,), 이름; () 및 튜플 유형 생성자 (,), (,,) 등을 형식 생성자로 사용합니다.

+0

규칙을 보았습니다 만, 연산자 앞에 ':'접두사가없는 데이터 생성자가 허용되지 않는 이유를 알고 계십니까? 어떤 종류의 표기법 모호성이 있습니까? – CMCDragonkai

+1

@CMCDragonkai : ":"는 "대문자 기호"로 간주 할 수 있습니다. 데이터 생성자가 대문자 또는 콜론으로 시작해야하는 이유는 이해할 수있는 것처럼 모든 가져온 모듈을 거치지 않고 생성자가 무엇인지 알 수 있습니다. 이는 패턴 일치가 잘 형성되었는지 아니면 생성자 대 변수인지를 결정하는 것과 관련이 있습니다. –