2017-09-04 17 views
0

오늘 우리에게이 코드를 보여 주었다 그러나 나는 그것의 결과를 이해할 수없는 것 :OCaml - 함수가 출력을 변경하지 않는 이유는 무엇입니까? 내 교수

# let a = 2;; 
val a : int = 2 
# let f = fun x -> fun y -> if x = y then a + 2 else a - 10;; 
val : f 'a -> 'a -> int = <fun> 
# f 1 (2 - 1);; 
- : int = 4 
# let a = 18;; 
val a : int = 18 
# f 1 (2 - 1);; 
- : int = 4 

을 ??? 기본적으로이 결과를 볼 수 있습니다.

- : int = 20 

왜 출력되지 않습니까?

답변

7

let a 동일한 이름의 새로운 변수를 도입했기 때문에 그것은,하지만 기능은 여전히 ​​그 범위의 하나를 말한다 - 그것은 closure, 그리고 그 이상 폐쇄 변수가 상수이다. 변수 이름은 호출 된 범위에서 변수 이름을 동적으로 조회하지 않습니다.

당신은 당신이 할당 할 수있는 변수에 mutable reference을 저장하여 예상되는 동작을 얻을 수 있습니다

# let a = ref 2;; 
    let f = fun x -> fun y -> if x = y then !a + 2 else !a - 10;; 
    f 1 (2 - 1);; 
- : int = 4 
# a := 18;; 
    f 1 (2 - 1);; 
- : int = 20 

는하지만, 통지이 일반적으로

원하는되지 않도록합니다. 변수가 항상 일정해야하므로 f은 호출시 4 또는 8 중 하나를 반환하는 대신 참조 셀에 할당 된 값의 위치와 시점에 따라 결과가 달라집니다. 당신이 할 수있는 곳에 그들을 피하십시오. 이 특별한 예에서는 다음과 같이 할 수 있습니다.

let f a x y = 2 + if x = y then 2 else -10 in 
let g = f 2 in 
print_int (g 1 (2-1)); 
let h = f 18 in 
print_int (h 1 (2-1));; 
+1

학생들을 참고하지 마십시오. :-p – PatJ

+1

@PatJ 정확히 내가 생각한 바 :-) 적절한 경고를 편집합니다. – Bergi

+0

@PatJ는이 경우 순수 바보보다 나쁜 바보입니다. –