2015-01-22 4 views
1

우리가 알고있는 데이터 타입을 정의 할 수 있는지 궁금해했습니다. 튜플이어야하고 현재 길이 (또는 요소 수가 결정 불가능합니다)입니다. 응용 프로그램은 다음과 같습니다 :은 Rascal에서 알려지지 않은 길이의 튜플 데이터 타입을 정의했습니다.

//I want to declare a data type, one of whose argument is a tuple, 
public data MyType=fromListCartesianProduct(tuple<?> product) 


//Later I want to instantiate a MyType data by using taking List-CartesianProduct 

//instantiate some MyType data 
foreach(aTuple in [1,2,3]*["a","b"]) 
    someArr[i]=fromListCartesianProduct(aTuple) 

"MyType"을 선언하는 동안 aTuple의 요소 수가 확인되지 않는 것이 현저합니다. 그런 유형의 불량 원본을 여전히 선언 할 수 있습니까?

대체, 난으로합니다 MyType를 선언합니다 :

public data MyType=fromListCartesianProduct(list[] product) 

및 특정 인스턴스를 구성하기 전에 목록에 직교 제품을 복용 각 튜플을 변환합니다. 명확성 및 기타 이유로 MyType을 이전에 정의한대로 정의하고자합니다.

답변

1

프린시 페에서 대답은 '아니오'입니다. 튜플의 길이는 고정되어 있고 행의 다형성은 없습니다 (아직).

에서 같은 키워드 매개 변수를 사용하여

  • 행 다형성, 당신은 항상 데이터 형에 더 많은 키워드 매개 변수를 추가 할 수 있습니다 :

    는 데이터 생성자 도움이 될 다형성의 다른 종류를 지원 않는다는 것을 말해 두 겠는데
    data MyType = myCons(int j = 0); // initial decl 
    data MyType(int k = 1); // extension with another field 
    
  • 오버로드, 당신은 항상 더 많은 매개 변수를 더 생성자를 추가 할 수 있습니다

    data MyType = f(int i); // initial declaration 
    data MyType = f(int i, int j); // overloaded declaration with more fields 
    

Typemake 함수를 사용하여 인수 목록을 기반으로 이러한 생성자를 동적으로 생성 할 수 있습니다. 물론 런타임 유형의 예외가 발생할 위험이 있습니다.

list[value] myListRelationOfUnknownType = ...; 
    for (<int i, int j> <- myListRelationOfUnknownType) 
     println("printing only pairs of ints: <i> - <j>"); 
    for (<int i, int j, int k> <- myListRelationOfUnknownType) 
     println("printing only the triples of ints: <i> - <j> - <k>"); 

이 정적으로 더 그 :

예측할 수없는 유형의 데이터를 다루는 또 다른 방법은 (는 value을하자), 나중에 패턴 밖으로 다시 길을 일치하는 유형 계층 구조에서 한 단계 위로 이동하는 것입니다 안전한 길.