2017-05-10 3 views
1

이것은 제가 작업 한 두 번째 SML 프로그램입니다. 이 함수들은 상호 재귀 적입니다. 만약 내가 이상한 (1) 전화 사실과 심지어 (1) 나는 거짓말을 받아야한다. 이 함수는 모든 양의 정수에 대해 작동해야합니다. 나는이 프로그램을 실행할 때, :숫자가 홀수인지 SML인지 여부를 알려주십시오.

fun 
    odd (n) = if n=0 then false else even (n-1); 
and 
    even (n) = if n=0 then true else odd (n-1); 

를 내가 얻을 :

[opening test.sml] 
test.sml:2.35-2.39 Error: unbound variable or constructor: even 
val it =() : unit 

어떻게이 문제를 해결할 수 있습니까?

답변

7

중간에 문제가있는 것은 세미콜론 (;)입니다. 세미콜론은 완전한 선언의 끝에서 (선택적으로) 허용되지만, and이 선언의 끝이 아닙니다!

따라서 선언되지 않은 even을 참조하는 유효하지 않은 선언 fun odd (n) = if n=0 then false else even (n-1)이 컴파일러에 불어납니다. 계속 진행한다면, 신고가 시작될 때 and의 불법적 인 사건이 발생하면 다음으로 폭파 할 것입니다. 세미콜론 의미 만 두 가지 상황이 있다는 것을


참고 : 표기 (...A... ; ...B... ; ...C...) 의미

  • 는 "...B..., ...A... 평가하고 ...C......C...의 결과를 반환
      .
    • 마찬가지로 let ... in ...A... ; ...B... ; ...C... end이라는 표기법을 사용합니다.이 경우 괄호는 선택 사항이므로 in ... end은 적절한 작업을 수행합니다. 그들의 내용을 keting.
  • 대화 형 REPL (read-evaluation-print 루프)을 사용하는 경우 최상위 수준 선언의 끝에있는 세미콜론은 "OK, 이제 실제로 진행하고 정교하게 평가합니다. 지금까지".

관용구 표준어는 위의 상황에서 실제로 세미콜론을 사용하지 않습니다. 절차 적 언어로 생각하기 시작하지 않고 세미콜론이 "문장 종료"또는 그와 비슷한 것을 기대하지 않는 한 그렇게 할 수 있습니다. 분명히 Standard ML에 ;을 사용하는 것과 C 및 그 구문 적 후손과 같은 언어로 ;을 사용하는 것 사이에는 관계가 있지만 직접적인 것은 아닙니다.

1

나는 이러한 기능은 재귀 만드는 교훈 점이있을거야,하지만 여기에 몇 가지 짧은 것들입니다 :

fun even x = x mod 2 = 0 
val odd = not o even 
관련 문제