2016-09-06 5 views
2
type FFRec<'state when 'state: (member Tape: Stack<unit -> unit>) 
        and 'state: (member Mem: ObjectPool) 
        and 'state: (member Str: CudaStream) 
        and 'state: (member Workspace: Workspace) 
        and 'state: (member IsInferenceOnly: bool)> = 
    { 
    W: d2M 
    b: d2M 
    a: d2M -> 'state -> d2M * 'state 
    } 

인터페이스로 모든 멤버 제약을 교체 할 수 있지만, 그 접근 방식에 작은 문제는 컴파일러가 인식 할만큼 똑똑하지 있다는 것을 나는 예를 들어 다음과 같은 기능이있는 경우 :멤버 제약 조건을 사용하여 유형 약어를 만들 수 있습니까?

let inline reluInitializer (state: ^state) (a: ^a) = 
    let scale = (1.0f/sqrt(addDims a |> float32)) 
    fillRandomUniformMatrix((str state),a,scale,0.0f) 
    a 

^state은 인터페이스 제약 조건이 있어야하고 설명 할 수없는 서명을 제공해야하며 구현은 일반 제네릭 매개 변수 선언에서 오류가 다를 수 있습니다.

가능하다면 명시 적 인터페이스보다 멤버 제약 조건을 사용하고 싶지만 형식 약어를 사용하여 위의 제약 조건 선언을 더 짧게 만들 수있는 방법을 찾지 못했습니다. 현재 F #에서 가능하겠습니까?

+0

'인라인'키워드를 살펴보십시오. 그것은 F #이하는 일에 가장 좋은 근사치입니다. – asibahi

답변

4

아니요, 유형에 정적으로 해결 된 유형 매개 변수를 사용할 수 없습니다.

정적으로 확인 된 유형 매개 변수는 CLR에서 지원되지 않으므로 컴파일시 지워야합니다. 이것은 콜 사이트에서 인라이닝하고 IL로 컴파일하지 않고 함수로 수행 할 수 있지만 런타임에 인스턴스를 가질 수 없기 때문에 유형에 IL 표현이 있어야합니다.

모든 구성원에 대해 하나씩 평가자 기능 형식으로 제약 조건을 표현하는 것을 고려해야합니다. 이런 식으로, 여러분의 타입이 "받아 들일 수없는"타입의 인자로 컴파일 되더라도, 그것의 사용법은 전체 프로그램을 효과적으로 제한하지 않을 것입니다.

예에서 ^state 매개 변수로 설명하는 문제에 대해서는 함수가 멤버 액세스 권한이 없으므로 그 원인을 알 수 없습니다. 회원과 관련된 오류.


주석에 대한 질문에 대답 : 아니오, 구성원 제약 조건을 재사용을 위해 포함 할 수 없습니다.

+0

접근 자 함수에 의해 '인라인으로 처리하라. v = (^ b : (멤버 삭제 : 유닛 -> 유닛) v)'와 같이 인라인 함수의 종류를 의미하는 경우 그 곳에서 사용하고 있습니다. 위에 보여준 것은 2k LOC 라이브러리의 일부분에 불과하므로 구현을 보여주는 것이 필요한지 확실하지 않았습니다. 일반 let 함수와는 달리 컴파일러에서는 멤버 제약 조건을 클래스 및 레코드에서 명시 적으로 작성하지 않고 클래스 자체 및 레코드에서 직접 작성해야하므로 유형 제약 조건을 축약 할 수 있는지 여부를 실제로 묻고있었습니다. –

+0

지금 상속을 사용하여이 작업을 시도하고 상속 제약 조건을 사용할 때 실제로 도움이되지 않는 유형 오류가 발생합니다. 기본적으로 전체 라이브러리는 인라인되어 있으며 간결성을 위해 정적으로 해석 된 유형 매개 변수를 사용합니다. –

+1

질문이나 문제를 더 명확히하지 않았습니다. 좀 더 구체적인 것을 시도하십시오. 원하는 결과 및 오류 메시지와 함께 예제를 제공하십시오. –

관련 문제