سؤال

لست متأكدا مما إذا سمحت الأنماط النشطة الأعضاء العامة غير الثابتة ولكن يمكنك تحديدها دون أن يشكو المترجم. إذا سمح لهم بما هو بناء الجملة للمطابقة ضد واحد؟ المترجم يعطيني عدم تطابق النوع foo في foobar2.dosomething. نتوقع أ 'a -> Choice<'b,'c> منح 'a -> 'd -> Choice<unit,unit>

// No error in this class, static works great
type FooBar() = 
    static member (|Foo|Bar|) (x, y) =
        match x = y with
        | true -> Foo
        | false -> Bar

    member x.doSomething y =
        match x, y with
        | Foo -> ()
        | Bar -> ()

type FooBar2() = 
    member x.(|Foo|Bar|) y =
        match x = y with
        | true -> Foo
        | false -> Bar

    // compiler error on "Foo"    
    member x.doSomething y =
        match y with
        | Foo -> ()
        | Bar -> ()
هل كانت مفيدة؟

المحلول

لا ينبغي استخدام الأنماط النشطة كأعضاء. حقيقة أن هذه تجميعها على الإطلاق هي علة مترجم أننا سنصلح (شكرا على التقرير :)). استخدم المحلي أو الوحدة النمطية "دع" لتحديد نمط نشط.

نصائح أخرى

أنا لست مندهشا أن هذا لا يعمل، ولا يمكنني رؤية التفسير الدلالي الطبيعي على سبيل المثال الأنماط النشطة. كيف تعرف أي مثيل للاستخدام عندما ترى Foo نمط؟ هل يمكن أن يكون لديك حالات مختلفة ل Foo و Bar الحالات (وبالتالي تطابق نمط غير مكتمل)؟ لا يبدو أن هناك حل أنيق للقضايا هنا. أن نكون صادقين، أنا من المفاجئة أنه حتى تعمل القضية الثابتة، ولا أرى أي شيء في المواصفات التي تتناول تعريف الأنماط النشطة كأعضاء من أي نوع.

يبدو أن التعرف على الأعضاء في الإصدار 1.9.9.9. حتى بالنسبة للأعضاء الثابتة. أعتقد أنه من العار لأنها مسموح بها للتحميل الزائد للدراج. يمكن أن يكون لدي التعرف على "اسم" للنوع، MemberInfo وما إلى ذلك. الآن أحتاج إلى الحصول على "Type_Name". "عضو" وما إلى ذلك لتجنب تسمية النزاعات. فقط "الاسم" كان أجمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top