2013-02-15 2 views
1

간단한 배열 추가 기능을 작성하려고합니다. 유일한 복잡성은 제네릭을 만들기위한 제 시도에서 비롯됩니다. C#에서는 값 유형에 대한 유형 제약이 없지만 F #에서는 explicit member constraint으로 작동하도록 이해하고 있습니다. 여기 내 시도입니다 :유형 제한이없는 일반 배열의 합

let Add<'T when 'T : (member (+) : 'T -> 'T -> 'T)> (A : 'T[]) (B : 'T[]) = 
    Array.init A.Length (fun i -> A.[i] + B.[i]) 

컴파일러는 세 가지 오류가 나열 A. 하나 [I], + 기호 하나, [I] B. 하나,하지만 내 생각은 걸 모두 동일 :

A type parameter is missing a constraint 
'when ^T : (static member (+) : ^T * ^T -> ^?6069)' 

이것은 단지 구문 문제 일 뿐이며 누구나 올바른 장소에서 나를 가리킬 수 있습니까?

p.s .:이 작업을 수행하는 데 다른 방법이 있습니까? 아니면 올바르게 작동하게하는 올바른 방법입니까?

답변

6

inline을 표시하십시오. 그러면 제약 조건이 유추됩니다.

let inline Add (A : 'T[]) (B : 'T[]) = 
    Array.init A.Length (fun i -> A.[i] + B.[i]) 
함수는이 방법으로 작성할 수

:

let inline add a b = Array.map2 (+) a b 

편집

당신이 (끔찍한 보이는)이 작업을 수행 할 수있는 명시 적 제약 조건을 만들려면을

let inline Add< ^T when ^T : (static member (+) : ^T * ^T -> ^T) > (A : ^T[]) (B : ^T[]) = 
    Array.init A.Length (fun i -> (^T : (static member (+) : ^T * ^T -> ^T) (A.[i], B.[i]))) 

하지만, 경고를 생성합니다 :

'op_Addition'이라는 이름의 멤버 제약 조건에는 F # 컴파일러에서 특정 멤버가 암시 적으로 추가되므로 특정 상태가 지정됩니다. 자체 코드에서 구성원 제한 조건을 호출하려고하면 런타임 오류가 발생할 수 있습니다.

+0

환상적! 컴파일러가 내 버전에 만족하지 못하는 이유는 무엇입니까? – vlad

+2

예. 명시 적 멤버 제약 조건은'inline'을 필요로합니다. – Daniel

+0

''inline' 함수를 선언했는지 여부와 같은 오류가 발생했습니다 – vlad