एक string
अनिवार्य रूप से char
मूल्यों का एक क्रम है (हास्केल में, Btw, String
[Char]
के लिए एक प्रकार का अन्य नाम है)। एक और सामान्य सवाल, तब होगा, यदि किसी दिए गए आकार के रूप में एक सूची घोषित करना संभव है।
ऐसी भाषा सुविधा Dependent Types के रूप में जानी जाती है, और F # में यह नहीं है। इसलिए, संक्षिप्त जवाब यह है कि घोषणात्मक फैशन में ऐसा करना संभव नहीं है।
सबसे आसान है, और शायद यह भी सबसे मुहावरेदार, जिस तरह से है, तो, एक एकल मामले भेदभाव संघ के रूप में Code
परिभाषित करने के लिए किया जाएगा:
type Code = Code of string
मॉड्यूल Code
को परिभाषित करता है, आप यह भी निर्धारित करेंगे एक समारोह ग्राहकों Code
मान बनाने के लिए उपयोग कर सकते हैं कि:
let tryCreateCode candidate =
if System.String.IsNullOrWhiteSpace candidate
then None
else Some (Code candidate)
इस समारोह रन-टाइम तर्क है कि खाली Code
मूल्यों का निर्माण करने से ग्राहकों को रोकता है:
> tryCreateCode "foo";;
val it : Code option = Some (Code "foo")
> tryCreateCode "";;
val it : Code option = None
> tryCreateCode " ";;
val it : Code option = None
क्या ग्राहक को अमान्य Code
मान बनाने से रोकता है, तो? उदाहरण के लिए, क्या कोई ग्राहक tryCreateCode
फ़ंक्शन को बाधित करने में सक्षम नहीं होगा और बस Code ""
लिखें?
यह वह जगह है जहां signature files आते हैं।आप एक हस्ताक्षर फ़ाइल (.fsi
) बनाते हैं, और है कि में इस तरह के प्रकार और कार्यों की घोषणा:
type Code
val tryCreateCode : string -> Code option
यहाँ, Code
प्रकार घोषित किया जाता है, लेकिन इसके 'निर्माता' नहीं है। इसका मतलब है कि आप सीधे इस प्रकार के मान नहीं बना सकते हैं। यह, उदाहरण के लिए, संकलन नहीं करता है:
Code ""
दिया त्रुटि है:
त्रुटि FS0039: मूल्य, निर्माता, नाम स्थान या प्रकार 'कोड'
परिभाषित नहीं है
Code
मान बनाने का एकमात्र तरीका tryCreateCode
फ़ंक्शन का उपयोग करना है।
के रूप में यहाँ दी, आप अब Code
की अंतर्निहित स्ट्रिंग मान, उपयोग कर सकते हैं जब तक आप भी उस के लिए एक समारोह प्रदान करते हैं:
let toString (Code x) = x
और एक ही .fsi
फ़ाइल में के रूप में ऊपर की घोषणा:
val toString : Code -> string
यह बहुत काम की तरह दिख सकता है, लेकिन वास्तव में केवल छह पंक्तियों की कोड है, और तीन प्रकार की घोषणा (.fsi
फ़ाइल में) है।
इस पोस्ट पर एक नज़र डालें: http://fsharpforfunandprofit.com/posts/designing-with-types-more-semantic-types/ - अनुभाग "मॉडलिंग प्रकारों के साथ स्ट्रिंग बाध्य"। आपको शायद इस – Petr
@Petr जैसे कुछ ऐसा करने की आवश्यकता होगी मैंने इस पोस्ट को देखा लेकिन मुझे यह समाधान कुछ हद तक जटिल लगता है। वैसे भी लिंक के लिए धन्यवाद। – Mikhail
हां, मैं मानता हूं कि वह पोस्ट थोड़ा जटिल है। मेरे यहां कुछ बेहतर उदाहरण हैं: https://gist.github.com/swlaschin/54cfff886669ccab895a। जैसा कि अन्य ने बताया है, समाधान विशेष रूप से सुरुचिपूर्ण नहीं हैं। ओटीओएच, आपको ओओ कोड में भी कुछ ऐसा करना होगा। – Grundoon