F #

2012-04-25 3 views
1
에서 참조로 호출

참조로 함수를 호출하는 옵션이 있습니까?F #

예를 들어

: 나는 FUNC1에서 변수 x가 있고 나는 그것을 변경할 수 있도록 (등 새로운 값을 반환하지 않고) FUNC2에 보내려면

let func1 = 
    let mutable x = 1 
    func2 x 
    System.Console.WriteLine(x) 

let func2 x = 
    x <- x + 1 

그래서 FUNC1를 호출하면 인쇄됩니다 "2"..

가능합니까? 그렇다면 어떻게?

감사합니다.

+1

F #에서 참조로 인수를 전달할 수 있습니다. 그러나 우리 중 몇 명이 지적했듯이, 이것은 함수형 프로그래밍의 일반적인 관용구와 매우 반대입니다. 그다지 당연하지 - 단지 드물다. –

+0

cookya. StackOverflow를 처음 접하는 사용자 일 수도 있습니다. 일반적으로 왼쪽의 투표 수 아래에있는 체크 표시를 클릭하여 답변을 수락하는 것이 좋습니다. 그런 식으로 다른 사람들이 귀하의 질문과 답변을 보는 경우 귀하의 질문에 대한 최선의 대답을 고려한 아이디어가 있습니다. –

답변

2

& 연산자와 byref 키워드를 사용할 수 있습니다.

let func1 = 
    … 
    func2 (&x) 
    … 

let func2 (x : int byref) = 
    … 

자세한 내용은 MSDN: Reference cells (F#)을 참조하십시오.

+0

대단히 감사합니다! – cookya

1
당신은 참조 세포 사용할 수 있습니다

:

let func1 ref = 
    ref := !ref+1 

let func2() = 
    let x = ref 1 
    func1 x 
    System.Console.WriteLine(!x) 

하지만 그것을하지 '모범 사례'일

2

의 C#에서 엄격한 번역의 이러한 종류의 일을하는 기능 언어 (약간을 넣어) 스타일 코드는 다음과 같을 것입니다 :

let func2 (x : byref<_>) = 
    x <- x + 1 

let func1 = 
    let mutable x = 1 
    func2 &x 
    System.Console.WriteLine(x) 

그러나 참조하는 것이 좋습니다.

편집은 (주석 참조) 지적 된 바와 같이, 당신은 아마에서 func1 함수 될 것이라고 의미 :

let func2 (x : byref<_>) = 
    x <- x + 1 

let func1() = 
    let mutable x = 1 
    func2 &x 
    System.Console.WriteLine(x) 
+0

"<_>"은 무엇을 의미합니까? – cookya

+0

게으른 제네릭. 이것은 F # 타입 - 추론이 무엇을 추측 할 것인가를 의미합니다 ('int'를 추측 할 것이므로 x의 타입은'byref '입니다). –

+0

'func1' 다음에'()'이 필요하다고 생각합니다. 이제는 함수가 아니라 값으로 선언되었습니다. – MiMo

2

당신은 무엇을 요구하는지하는 것은 가능하지만 그것은 꽤 많은 반대입니다 F #이 권장하는 기능적 접근법.

let func2 x = 
    x + 1 

let func1() = 
    let x = 1 
    let y = func2 x 
    System.Console.WriteLine(y) 

이 함수형 프로그래밍 (및 F 번호)에서 이런 종류의 작업을 수행하는 더 관용적 방법입니다 :이 작업을 수행 할 수없는 강력한 이유가 있나요. 또는 당신은 이것에 대해 어떻게 다음 X를 변이해야하는 경우 : 그런데

let func2 x = 
    x + 1 

let func1() = 
    let mutable x = 1 
    x <- func2 x 
    System.Console.WriteLine(x) 

, F #으로, FUNC2 그것이 사용되는 전에 정의되어야한다.

+0

사실상 선언문에서'func1'가''()''을 선언 할 필요가 없습니까? – MiMo

+0

당신은 정확합니다 - 나쁘다. 코드가 수정되었습니다. –