2011-10-10 5 views
0

이 두 동일합니다F # : 함수를 정의하는 두 가지 방법은 무엇입니까?

let f(x) = 
    10 

let g = fun(x) -> 
    10 

생각? 그들은 똑같은 일을하는 것처럼 보이지만 두 가지 행동이 다를 수있는 경우가 있습니까? 두 번째 버전은 <|<< 연산자를 사용하여 파이썬 스타일 데코레이터 패턴을 구현할 수 있기 때문에 유용합니다 (더 자세한 경우에도 마찬가지입니다). 어떤 경우에 첫 번째 버전을 사용하고 있습니까?

또한 두 번째 방법이 어떻게 작동하는지 완전히 이해합니다. (오른쪽의 내용은 g로 덤프하는 함수 표현이지만) 첫 번째 방법은 어떤가? 해당 구문을 간단한 대입 문에서 함수 정의로 변환하는 컴파일러 트릭이나 특수한 경우가 있습니까?

+0

f <| // 첫 번째 버전이기도합니다. – BLUEPIXY

답변

3

Brian은 이미 대답 했으므로이 둘은 같습니다. let을 사용하여 함수를 선언하는 대신 fun을 반환하면 함수를 반환하기 전에 무언가 (즉, 초기화)를 수행하려는 경우 차이가 발생합니다.

여기
let f1 x = 
    let rnd = new System.Random() 
    x + rnd.Next() 

let f2 = 
    let rnd = new System.Random() 
    fun y -> y + rnd.Next() 

, 기능 f1가 실행되어 새로운 Random 예를 때마다 만들지 만 f2는 동일한 인스턴스를 사용하면 임의의 숫자를 추가 기능을 만들려는 경우

예를 들어, 당신은 쓸 수 항상 rnd입니다 (따라서 f2이 더 좋은 방법입니다). 그러나 fun을 즉시 반환하면 F # 컴파일러는 코드를 최적화하고 두 경우가 동일합니다.

4

등가입니다 ('값 제한'을 모듈화하여 값이 아닌 기능을 일반화 할 수 있습니다. 예 : here 참조).

관련 문제