2011-12-16 2 views
2

수와 값의 개수가 다양 할 수있는 데이터 유형을 선언하고 싶습니다. 예 :무제한 변수 이름 선언 수성 있음

type goal ---> pick; give; come. 

에는 세 가지 변수/값이 있습니다. 변수의 개수가 제한되거나 고정되지 않습니다

type myplayer ---> de value declaration here. 

:

내가 좋아하는 뭔가를 원한다.

그래서 myplayer를 사용하여 v1, v2, v3 and v4.과 같은 값/변수를 선언 할 수 있습니다. 두 번째로 delighter와 같은 것을 사용할 수 있습니다 : a, b, c, d, e, z, aa, ab and az.

값의 수는 제한되지 않으며 이름도 고정되어 있지 않습니다.

새로운 수은이 필요하므로 도움이 필요합니다.

감사합니다.

+0

당신은 "두 번째"무엇을 의미합니까?myplayer를 다시 정의하거나 두 번째 사용에서 다른 값의 하위 집합을 사용하겠다는 뜻입니까? 또한, 더 큰 컨텍스트가 무엇입니까? 그것은 당신이 파라 메트릭 타입이나 typeclass를 원할지도 모르는 것처럼 들리지만 컨텍스트 없이는 확실하지 않습니다. –

답변

1

직접 물어보십시오. 간단하게 수행 할 수 없습니다.

을 감안할 때
:- type question 
     ---> truth(string, bool) 
     ;  blank(string, string) 
     ;  multiple(string, string, list(string)). 
질문

추가 종류 만이 정의 된 유형을 확장하고, 모듈을 재 컴파일하여 추가 할 수 있습니다 -

answer(truth(_, yes)) = "true". 
answer(truth(_, no)) = "false". 
answer(blank(_, A)) = A. 
answer(multiple(_, A, _)) = A. 
처럼 이전에 결정 코드로도, 그리고 다른 많은 변화를 만드는

은 새로운 질문 유형이 주어질 때 실패합니다. 컴파일 타임에 프로그램을 업데이트하지 않고 "모든 것을 선택하십시오"라는 질문 유형을 추가로 반영한 것은 질문 유형이 전혀없는 이유 중 좋은 부분입니다. 귀하의 질문 은행에 문자열 목록 [["Are foxes pretty?", "true"], ["Green foxes are ____", "adorable!", "fake", "evidence of animal cruelty"]] 대신 말하십시오.

당신이 원하는 것은 할 수 없습니다. 그러나 실제로하고 싶은 것, 즉 '가변 수의 유형'이 유용한 수단이 될 것이라고 생각한 끝은 확실하게 다른 방법으로 성취 될 수 있습니다. 나는 당신이 당신의 질문에서 이것을하고 싶었던 이유를 말할 수 없기 때문에 그것이 어떤 의미인지를 말할 수 없습니다. 언어 참조에서 discriminated unions 또는 typeclasses을 읽는 것이 도움이 될 수 있습니다.

+2

사실이 아닙니다. 술어가 실패하지 않도록 문자열 유형의 특정 인스턴스를 선언 할 수 있습니다. 예 : : - inst foo == bound ("x"; "y"; "z"). : - func bar (string :: in (foo)) = (int :: out)은 det입니다. 이것이 이상한 *이라고 인정하지만 OP가 원하는 것 (내가 생각하는 것)을 달성 할 것입니다. –

2

다른 사람들이 말했듯이, 이것은 단순히 수성에서 불가능합니다 - 이는 신중한 것입니다. 당신이 표현하는 유형하려는 경우, 그래도 할 수 있습니다 무엇

:

:- type my_type 
    ----> v(int). 

:- func name(my_type) = string. 

name(v(Num)) = formst("v%d", [i(Num)]). 

유형은 모든 정수의 V를 표현하고, 함수 이름에 사용할 수 있습니다 : V1 V2 V3 ... 등입니다 이 타입의 'pretty-print'값.

1

나는이 질문을 이해한다. 프롤로그와 비슷한 행동이 필요합니다. 즉, 술어를 입력하지 않아도됩니다. 정적으로 입력 된 시스템에서는 사용자가 직접 처리하여 이러한 동작을 얻을 수 있습니다. 많은 시간 전 터보 프롤로그 (Turbo/Visual Prolog의 관점에서 ISO 프롤로그 구현)에서 이러한 예를 보았습니다.

(나는이 올바른지 확실하지 않다) 같은 것을 생각해

:- type any_type ---> atom_value(string) 
       ; number_value(int) 
       ; struct_value(any_type, list(any_type)). 

guess(atom_value("v1")). 
guess(atom_value("a")). 
guess(atom_value("aa")). 
guess(number_value(42)). 
guess(struct_value(atom_value("pair"), [number_value(3), number_value(4)])).