2009-04-27 3 views
1

SML에서 명령을 실행 한 후 명령에서 반환 된 데이터와 유형이있는 "it"이 반환됩니다. 예를 들면 :SML에서 유형 정보를 인쇄하려면 어떻게해야합니까?

false; 
val it = false : bool 

의가 나는과 같이 프로그램에서 바인딩 있다고 가정 해 봅시다 : 프로그램의 중간에 "argsToOutput"(의 가치와 데이터 유형을 인쇄 할 수있는 방법이 있나요

val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
           (lookupReference env n)) exps) 

)와 비슷한 방식으로 "그것"이 인쇄됩니까?

답변

1

SML은 정적으로 형식이 지정되므로 프로그램의 모든 값 유형은 컴파일 타임에 정적으로 알 수 있습니다. 나는 당신이 "그것을 인쇄하고 싶을 때"당신이 원하는 것을 확신하지 못합니다.

어쩌면 코드 유형을 직접 보면서 알 수 없습니다. 최상위 레벨의 값을 인터프리터에 직접 정의하거나 use "whatever.sml";을 사용하여 파일을로드하면 인터프리터는 해당 값에 대해 유추되는 유형을 알려줍니다.

코드 조각이 있으면 여기에 코드를 게시하고 여기에 의존하는 코드도 게시 할 수 있으며 특정 값이 어떤 유형인지 파악할 수 있습니다.

특정 값이 특정 유형인지 확인하려면 유형 가드를 사용할 수 있습니다. (expression : type)expression과 동일하지만 유형 검사 중에 해당 표현식이 해당 유형인지 확인합니다.

런타임에 형식 정보를 얻고 싶다면 컴파일 타임에 이미 알고 있기 때문에 할 수 있다고 생각지 않아도됩니다.

+0

문제는 내가 유형이 무엇인지 모르는 것입니다. 나는 클래스 용 코드를 작업 중이며 CM.make를 사용하여 6 개의 파일 세트를 "컴파일"합니다. 어떤 데이터 유형 (및 값)이 특정 바인딩에 실제로 바인딩되는지 파악하기 위해 고심하고 있습니다. 이 경우 모든 코드를 게시하는 것은 비현실적입니다. 다른 아이디어? –

+0

나는 몰라. 파일을 인터프리터에로드 할 수있는 방법이 있습니까? 또는, 모든 함수 인수에 유형 주석을 넣고 유형 및 변수를 리턴 할 수 있습니다. ML에서 타입 추론의 일부는 변수에 대한 타입을 선언 할 필요가 없다는 것을 알고 있지만 때로는 디버깅에 유용합니다. 또한 어쨌든 값에 대한 유형 가드를 넣을 수도 있고, 유형을 확인하지 않으면 오류 메시지가 실제로 유형을 알 수 있습니다. – newacct

2

당신은 할 수 : 대신 2의 당신이 당신의하자 본체의 값이

val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
           (lookupReference env n)) exps) 
... 
in 
    (print (argsToOutput); 2) 
end 

합니다. 확률은 argsToOutput에 print barf이지만, 예상되는 유형이 문자열 인 곳에서 발견 된 유형을 제공합니다.

데이터 유형의 값을 출력해야 할 때 데이터 유형을 가져온 tostring() 함수를 작성하여 문자열로 변환했습니다. 일부 중첩 된 데이터 유형이 있었기 때문에 작업이 필요했지만 그 유형의 모든 변수에 대해 작업했기 때문에 이후에 매우 유용했습니다.

1

컴파일러는 컴파일 단계에서 형태를 유지하기 때문에

가 아니,이 최상위에서 작동 (프로그램의 중간에) "argsToOutput"값 및 데이터 유형을 인쇄 할 수있는 방법이 있나요 . 함수 본문에서 추출한 임의의 표현식에서는 작동하지 않습니다. 당신이 값이 함수의 독립적 인 표현을 가질 정도로 운이 좋다면, 당신은 당신이 원하는 무엇을 빼고 최상위 수준에 바인딩 val를 작성하고 얻을 수 있습니다 :

- val thing = hd [1, 2, 3]; 
val thing = 1 : int 

이는 이후 가난한 위안이다 관심있는 경우는 거의 없습니다.

나는 다른 자주 묻는 질문에 대한 답변을 검색 할 수 있습니다 생각 :

  1. 가 어떻게 내 ML 프로그램 입력 - 확인받을 수 있나요?
  2. 잘 입력 된 ML 프로그램의 하위 표현식 유형을 어떻게 확인할 수 있습니까?
  3. ML 프로그램에서 어떻게 디버깅을위한 값을 인쇄 할 수 있습니까?

은 (답변은 추한 수 있습니다.)

관련 문제