2016-12-24 1 views
2

파이프 라인 연산자에서 모듈 및 정적 멤버 함수의 함수를 사용할 수 있습니다. 비 정적 멤버 함수와 함께 사용할 수 있습니까?멤버 함수가있는 파이프 라인 연산자

내 클래스 :

type MyClass = 
    class 
     new() = {} 

     member this.isZero(number: int): bool = 
      number = 0 

     static member returnInt(): int = 
      33 
    end 

정적 멤버 사용 : 비 정적 멤버 사용

MyClass.returnInt() |> Console.WriteLine // prints 33 

을 : 나는에서 비 정적 기능을 사용하려면

let foo = new MyClass() 
foo.isZero(2) |> Console.WriteLine // prints false 

을 내 목적. 구문이 잘못되었습니다.

let foo = new MyClass() 
foo |> member MyClass.isZero(2) |> Console.WriteLine 

F #의 명확한 구문을 사용하려고합니다.

+2

" 비 정적 멤버 사용 "은하지 않습니까? 'member'는 실제 멤버 선언에서 사용되는 곳이 아닙니다. – TeaDrivenDev

+4

OP가이 일을 시도하고 있다고 생각합니다. https://fslang.uservoice.com/forums/245727-f-language/suggestions/5663326-syntax-for-turning-properties-into-functions 아니, 가능하지 않습니다. . 당신의 예제에서,'foo.isZero (2)'를하는 것이 잘못된 이유는 무엇입니까? –

답변

3

질문에 foo과 같은 이미 식별자가있는 경우 foo.isZero(2) |> ...은 짧고 읽을 수 있습니다. 더 긴 파이프 라인 안에 람다 표현식을 사용하십시오 :

funcThatReturnsMyClass(...) |> fun m -> m.isZero(2) |> Console.WriteLine 

우선 순위 참고; 상황이 복잡해지면 람다 주변에 괄호를 추가 할 수 있습니다 (예 : |> (fun m -> ...) |>).

이 사례가 많이 나타날 경우 일부 카레 기능을 추가하면 도움이 될 수 있습니다. 이것은 정적 멤버 또는 let-bound 함수가 소문자로 시작하는 반면 인스턴스 멤버는 대문자로 시작하는 규칙에 잘 적용됩니다. 당신이 경우에 도트 표기법을 사용할 수 있습니다, 지금

type MyClass2 (magicInt : int) = 
    member __.IsMagic i = i = magicInt 
    static member inline isMagic i (instance : MyClass2) = instance.IsMagic i 

뿐만 아니라 파이프 라인 : 당신이 파이프 라인을 많이 필요하지만 점 표기법을 지원하려는 경우이 방법, 당신은 구문의 두 종류를 정의 할 수 있습니다 |> MyClass2.isMagic 2 |> ...

isMagic의 구현은 과도하게 보일 수 있지만 요점은 추가 비용없이 다른 구현으로 전달하는 것입니다. 이것은 구현이 짧은 경우에도 구현을 복사하는 것보다 낫습니다. 동기화를 벗어나 추가 테스트가 필요할 수있는 추가 변형을 만들지 않기 때문입니다.

관련 문제