2009-07-30 7 views
2

우선이 문제를 다루는 더 좋은 방법이 있으므로 문제가되지 않습니다.F # : 이상 유형 유추 행동

그러나 이해할 수없는 부분입니다. 누군가 이것을 설명 할 수 있습니까? 나는이 잘 같은 스왑 기능을 사용할 수 있어요

namespace Utilities 
module Misc 

let Swap (left : 'a byref) (right : 'a byref) = 
    let temp = left 
    left <- right 
    right <- temp 

:

나는대로 스왑 함수를 정의합니다.

Misc.Swap (&s.[i]) (&s.[j]) 

하지만 같은 모듈 정의 할 때 :

This expression has type 'b byref but is here used with type 'a ref 

어떻게 발신자의 인수에 대한 형식 유추가 이동하여 변경 않았다 : 나는 두 인수에 다음과 같은 오류가

namespace Utilities 

type Misc = 
    static member Swap (left : 'a byref) (right : 'a byref) = 
     let temp = left 
     left <- right 
     right <- temp 

을 함수 유형에?

+0

감사합니다; 우리는 아마도 'byref'카레 매개 변수를 사용하지 못하도록 언어 명세를 바꿀 것입니다. 부분적인 응용 프로그램이 byref를 포착하려고 시도했기 때문에 좋지 않습니다. :) – Brian

답변

2

이것은 F # 컴파일러가 클래스 메서드에서 수행하는 튜플 변환과 상호 작용할 수 있습니다. 그래서 우리는 컴파일러가 tupled 형태로 카레 인수를 변형 것을 여기에서 볼 수 있습니다

public static void Swap<a>(ref a left, ref a right); 

:

리플렉터는 Misc.Swap의 유형을보고합니다. tupled 인수 방법을 정의

이 문제 방지 :이 질문에 대한

type Misc = 
    static member Swap(left : 'a byref, right : 'a byref) = 
     let temp = left 
     left <- right 
     right <- temp  

> let s = Array.init 3 (fun i -> i) 
> val s : int array = [|0; 1; 2|] 
> Misc.Swap (&s.[2], &s.[0]) 
> s;; 
> val s : int array = [|2; 1; 0|] 
+0

그럼 튜플 인자로 원래의 문제 유형을 호출 할 수 없습니까? – telesphore4

+0

나는 당신이 무엇을 부를 수 있는지 알고 있습니다. 당신은 더 구체적 일 수 있습니까? 감사. –

+0

저는 실제로 첫 번째 작업 버전을 사용하고 있습니다. 나는 단지 것들이 합쳐지지 않는 이유를 이해하려고 노력하고있다. – telesphore4