왜 레코드 구문에는 Maybe를 사용할 수 있지만 일반 ADT 구문에는 사용할 수 없나요?

StackOverflow https://stackoverflow.com//questions/25026671

  •  21-12-2019
  •  | 
  •  

문제

나는 공식적인 영어 문법을 표현하기 위해 하스켈로 몇 가지 데이터 유형을 작성하고 있습니다.

data S = NP VP

지금까지는 문장이 명사구와 동사구일 뿐이었습니다.대수 데이터 유형의 우아한 아름다움에 감탄해보세요!

또한 한정사와 형용사를 다음과 같이 정의하겠습니다.

data D = A | An | The
type Adj = String -- Too many adjectives for me to list, so I make it a type
                  -- synonym for String.

이제 선택적 결정사와 형용사가 있는 명사인 NP를 정의하는 데 문제가 있습니다.나의 첫 번째 자연스러운 본능은 Maybe를 사용하는 것이다:

data NP = Maybe D Maybe Adj N

나에게 오류가 발생합니다.

Expecting one more argument to `Maybe' In the type `Maybe' In the definition of data 
constructor `Maybe' In the data type declaration for `NP'

(Data.Maybe를 가져왔는지 여부에 따라 오류는 변경되지 않습니다.)

내가 이 작업을 수행할 수 있는 유일한 방법은 레코드 구문을 사용하는 것이었습니다.

data NP' = NP' {determiner :: Maybe D, adjective :: Maybe Adj, noun :: N}

레코드 구문을 사용할 때만 이것이 작동하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

시도

data NP = NP (Maybe D) (Maybe Adj) N
.

에 필요합니다.

  1. 생성자 이름으로 시작 :이 경우 NP
  2. 괄호
  3. 를 괄호로 몰두함으로써 수행 한 Maybe에 단일 인수 만 적용하십시오.
  4. 는 생성자에서 3 개의 개별 슬롯을 나타냅니다. 각 구성 요소 유형

다른 팁

내 생각에 당신은 ( NP 데이터 생성자):

data NP = NP Maybe D Maybe Adj N

귀하의 예에서는 NP 5개의 인수가 있는 생성자로 정의되고 있으며 그 중 첫 번째 인수는 "Maybe".이것은 작동하지 않습니다. 왜냐하면 Maybe 오류 메시지에서 알려주는 유형 매개변수가 하나 필요한 유형입니다.

원하는 해석을 얻으려면 다음을 둘러싸야 합니다. Maybe _괄호 포함:

data NP = NP (Maybe D) (Maybe Adj) N
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top