سؤال

في Haskell ، من السهل إنشاء نوع جبري/اتحاد تمييز "قابل للشفاء" كسلسلة عن طريق إضافة ببساطة deriving Show إلى تعريف النوع.

في F# انتهى بي الأمر إلى كتابة أشياء مثل:

type Pos = 
    | Pos of int * int
    override this.ToString() = 
        match this with
        Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp

ومن الواضح أن الأمر يزداد سوءًا مع أنواع أكثر تعقيدًا.

أي طريقة للحصول على شيء مثل deriving Show في F#؟

هل كانت مفيدة؟

المحلول

وظائف الطباعة F# مثل printf يمكن تنسيق أي نوع بيانات بشكل معقول إذا كنت تستخدم %A محدد التنسيق (يستخدمون ToString إذا حددت %O). يمكنك تنفيذ ToString استخدام sprintf الذي يعيد السلسلة المنسقة:

type Pos =  
    | Pos of int * int 
    override x.ToString() = sprintf "%A" x 

هذا يطبع على سبيل المثال "POS (1 ، 2)" وهو يعمل لمعظم أنواع F# (القوائم ، النقابات ، السجلات ، tuples). إنه أطول قليلاً من مجرد الإضافة deriving Show لكن على الأقل ليس عليك تنفيذ الطباعة بنفسك.

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