generics - स्थैतिक रूप से हल किए गए प्रकार पैरामीटर के साथ रिकर्सिव मानचित्र में अजीब प्रकार की त्रुटि को कैसे हल करें?



static f# (1)

मुझे लगता है कि आप ऐसा कुछ करना चाहते हैं:

    ...

    static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D<float32>) = sprintf "float *%s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D<int>) = sprintf "int *%s" t.Name

let inline print_arg x =
    let inline call (tok : ^T) = ((^T or ^in_) : (static member PrintArg: ArgsPrinter * ^in_ -> string) tok, x)
    call ArgsPrinter       

type ArgsPrinter with
    static member inline PrintArg(_: ArgsPrinter, (x1, x2)) = [|print_arg x1;print_arg x2|] |> String.concat ", "
    static member inline PrintArg(_: ArgsPrinter, (x1, x2, x3)) = [|print_arg x1;print_arg x2;print_arg x3|] |> String.concat ", "

आप इस प्रकार के मध्य में जेनेरिक फ़ंक्शन को परिभाषित करते हैं क्योंकि आप इसे पिछले दो अधिभारों के लिए उपयोग करेंगे, जो कि 'रिकर्सिव ओवरलोड' की तरह बन जाएगा।

ध्यान दें कि इस तकनीक को वर्तमान में FSharpPlus में प्रयोग किया गया था , वास्तव में तकनीक का एक सरलीकरण।

अंत में ध्यान दें कि आपका समाधान मेरे लिए भी सही है (हालांकि अधिक वर्बोज़) परन्तु किसी कारण से एफ # संकलक उलझन में पड़ता है, मैं आपको समझा नहीं सकता, लेकिन इस तरह से कई परिस्थितियों से मिले हैं, और मैं जो कुछ कर सकता हूं, एक न्यूनतम रिपो , एक वैकल्पिक हल और एफ # लोगों को इसकी रिपोर्ट करें बाध्यता समाधान में हल करने के लिए अब भी बहुत कुछ है

type CudaInnerExpr<'t> = CudaInnerExpr of expr: string with
    member t.Expr = t |> fun (CudaInnerExpr expr) -> expr

type CudaScalar<'t> = CudaScalar of name: string with
    member t.Name = t |> fun (CudaScalar name) -> name

type CudaAr1D<'t> = CudaAr1D of CudaScalar<int> * name: string with
    member t.Name = t |> fun (CudaAr1D (_, name)) -> name

type CudaAr2D<'t> = CudaAr2D of CudaScalar<int> * CudaScalar<int> * name: string with
    member t.Name = t |> fun (CudaAr2D (_, _, name)) -> name

type ArgsPrinter = ArgsPrinter with
    static member inline PrintArg(_: ArgsPrinter, t: CudaScalar<float32>) = sprintf "float %s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaScalar<int>) = sprintf "int %s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaAr1D<float32>) = sprintf "float *%s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaAr1D<int>) = sprintf "int *%s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D<float32>) = sprintf "float *%s" t.Name
    static member inline PrintArg(_: ArgsPrinter, t: CudaAr2D<int>) = sprintf "int *%s" t.Name

    static member inline PrintArg(_: ArgsPrinter, (x1, x2)) = 
        let inline print_arg x = 
            let inline call (tok : ^T) = ((^T or ^in_) : (static member PrintArg: ArgsPrinter * ^in_ -> string) tok, x)
            call ArgsPrinter
        [|print_arg x1;print_arg x2|] |> String.concat ", "
    static member inline PrintArg(_: ArgsPrinter, (x1, x2, x3)) = 
        let inline print_arg x = 
            let inline call (tok : ^T) = ((^T or ^in_) : (static member PrintArg: ArgsPrinter * ^in_ -> string) tok, x)
            call ArgsPrinter
        [|print_arg x1;print_arg x2;print_arg x3|] |> String.concat ", "

लाइन में static member inline PrintArg(_: ArgsPrinter, (x1, x2, x3)) = , अभिव्यक्ति (x1, x2, x3) मुझे निम्न त्रुटि देता है:

Script1.fsx(26,52): error FS0001: This expression was expected to have type
    'in_    
but here has type
    'a * 'b * 'c

यह काम करने के लिए यहां क्या करना है यह कोई भी विचार है?





inline