2014-11-27 3 views
8

누군가이 F # 호기심을 설명 할 수 있습니까?인터페이스의 튜플 된 인수

type IFoo = 
     abstract member Bar1: int * int -> int * int 
     abstract member Bar2: int * int -> (int * int) 
     abstract member Bar3: (int * int) -> int * int 

    type Foo() = class end 
     with 
     interface IFoo with 
      member this.Bar1 (x, y) = (x, y) 
      member this.Bar2 (x, y) = (x, y) // Same impl as Bar1 i.e. parentheses on RHS of -> in interface member definition are ignored 
      // member this.Bar3 (x, y) = (x, y) // Compile error: "This override takes a different number of arguments to the corresponding abstract member" 
      member this.Bar3 tuple = tuple // So, parentheses on LHS of -> in interface member definition *does* make a difference! 

IFoo.Bar1IFoo.Bar3의 정의와 의미의 차이점은 무엇입니까?

답변

9

여기서 입력 유형은 튜플 또는 CLI 메소드의 인수 목록이라는 두 가지 다른 것을 설명 할 수 있습니다.

이 반환 유형의 유일한 해석은 튜플이므로 반환 형식에 차이가 없습니다. 그러나 인수 목록에서 두 개의 인수를 취하는 CLI 메소드 또는 하나의 인수를 취하는 CLI 메소드 (이 경우에는 터플이 될 수 있음)를 결정할 수 있습니다. 후자는 여분의 괄호로 표시됩니다.

그렇기 때문에 다른 튜플로는 입력 할 수없는 단일 인수 인 Bar3을 구현할 수 있습니다. (F # 3 기준).

이중 괄호가 단일 괄호와 다른 점이 있습니다. Bar3이 abstract가 아니면 member this.Bar3 ((arg1, arg2))으로 튜플 입력을 시행 할 수 있습니다.

메소드 인수 목록에는 선택적 인수와 같은 추가 기능이 있습니다. 그래서 :

type Test() = 
    member t.BarA(a, ?b) = a 
    member t.BarT((a, ?b)) = a // Error 

마지막 줄은 b 지금 튜플 패턴의 일부, 메소드의 인수 목록에없는 인수 이후, "선택적 인수는 형의 멤버에 사용할 수 있습니다"오류를 제공합니다.

+0

흥미로운 - CLI 세부 정보가 F # 구문으로 새어 나옵니다. 나는 이것이 interop 이유로 필요하다고 생각합니까? 순수 F # 코드의 경우 두 경우를 구별 할 이유가 없습니다. – Akash

+1

@Akash CLI 메서드의 세계가 왜 다중 패러다임 언어로 F #의 일부가 되었든 상관없이, 그 이유는 무엇이든간에. 오버로드, 상속 및 오버라이드, 선택적 인수 등이 있으며 이러한 기능은 null이 아닌 방식으로 interop에 독점적으로 간주되지 않습니다. 그러나 기능적 우선 프로그래밍과 항상 잘 결합되는 것은 아닙니다. 순수 기능 코드에서는 이러한 기능이 사용되지 않으므로 기능 부품은 CLI 방법과 잘 매핑됩니다. 단, 질문에 표시된 희소 한 어색함을 제외하고는. – Vandroiy