2014-11-26 4 views
2

리스트를 가져 오거나 출력하는 술어에 대해 pred를 선언하는 도움말을 찾으십시오. 나는 시도했다 : - pred 이름 (list :: in, integer :: out)은 다중이다. 컴파일러 오류 메시지는/0이 인식되지 않는다고 말합니다. 체크 된 라이브러리 모듈 목록을보고 ... (list (T) :: in ....)와 같은 것을 써야하지만, 무엇을해야하는지 완전히 이해하지 못했습니다.목록을 가져 오거나 출력하는 조건 자에 대한 pred를 선언하는 방법은 무엇입니까?

답변

2

리스트는 매개 변수 유형이며 매개 변수 유형은 하나 이상의 매개 변수를 취합니다. list의 경우 매개 변수는 이것이 무엇인지를 나타냅니다. 숫자 목록, 문자열 목록, 호박 목록 또는 숫자 목록 (모든 유효한 유형)이있을 수 있습니다. 그래서 다음과 같은 함수를 만들면 :

:- func max(list(int)) = int. 

이 함수는 int 목록을 취하여 int (목록에서 찾을 수있는 최대 수)를 반환합니다.

그래서 목록 (T)은 무엇입니까? 대문자로 시작하는 토큰은 유형에서도 변수이며, 다른 유형 (대개)을 나타낼 수 있습니다. 따라서 "list (T)"는 숫자 또는 문자열 목록과 같은 항목의 목록을 의미합니다. 다음 술어는 다형성이며, 변수의 실제 값에 따라 다른 유형에 대해 작동합니다.

:- pred first(list(T)::in, T::out) is semidet. 

목록의 첫 번째 항목이있는 경우 반환되는 항목이 있으면 그 목록이 전달 될 수 있습니다. 이것을 "list (string)"문자열 목록과 함께 사용하면 "string"으로 T가 대체됩니다 (컴파일 중).

수성 유형 시스템의이 부분에 대한 참조는 여기에 있습니다. http://www.mercurylang.org/information/doc-release/mercury_ref/Discriminated-unions.html#Discriminated-unions

0

나는 시도했다 : - pred 이름 (... list (T), ....) ... 그리고 컴파일러는 더 이상 내 pred 선언과 관련된 오류를보고하지 않습니다. 결과가 정확할 것이라는 것을 아직 알지 못하지만 한 걸음 더 가깝습니다.