2010-02-05 3 views
9

F #에서 고유 한 연산자를 정의 할 수있는 방법이 있습니까?F #에서 고유 한 연산자를 정의 할 수 있습니까?

그렇다면 누군가가 내게이 예제를 줄 수 있습니까? 나는 잠깐 수색했지만 아무 것도 찾을 수 없었다.

+0

나중에 참고할 수있는 개념은 연산자 오버로딩이라고합니다. Google F # 및 연산자 오버로딩을 사용하면 주제에 대해 많은 정보를 얻을 수 있습니다. –

+0

감사합니다. –

답변

25

Yes (예) :

let (+.) x s = [for y in s -> x + y] 
let s = 1 +. [2;3;4] 

F 번호 연산자에 사용할 수있는 문자는 section 3.7 of the spec에 나열되어 있습니다. 그들은 !%&*+-./<=>@^|~이고 첫 번째 문자 이후의 문자는 ?입니다. 우선 순위와 고정 성은 운영자의 첫 번째 특성에 의해 결정됩니다 (스펙 참조).

위에서 수행 한 것처럼 직접 let-bound 연산자를 만들 수 있습니다.이 경우 let-bound 함수처럼 작동합니다. 당신은 또한 유형에 멤버로 정의 할 수 있습니다 :

type 'a Wrapper = Wrapper of 'a with 
    static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let w = (Wrapper 1) +! (Wrapper 2) 

이 경우, 당신은 연산자를 사용 할 수 있도록 바인딩 기능을 미리 정의 할 필요가 없습니다; F #이 형식에서 찾을 것입니다. 당신이 사용하는 인라인 정의로 특히 잘 활용할 수 있습니다 :

let inline addSpecial a b = a +! b 
let w2 = addSpecial w (Wrapper 3) 

는 더욱이 촬영, 인라인뿐만 아니라 당신의 유형에 연산자를 만들 수 있습니다, 당신의 인스턴스의 경우에도보다 다양한에서 사용할 수 있도록 귀하의 수업 :

type 'a Wrapper = Wrapper of 'a with 
    static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let wi = (Wrapper 1) +! (Wrapper 2) 
let wf = (Wrapper 1.0) +! (Wrapper 2.0) 
let wi2 = addSpecial wi wi 
let wf2 = addSpecial wf wf 
+3

섹션 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html)에는 중온 연산자 및 허용되는 문자에 대한 몇 가지 추가 정보가 있습니다. – nlucaroni

관련 문제