एक अवलोकन (चकित मुझे उस तरह) का एक न्यूनतम उदाहरण के बाद:आंशिक विखंडन (एफ #)
type Vector = V of float*float
// complete unfolding of type is OK
let projX (V (a,_)) = a
// also works
let projX' x =
match x with
| V (a, _) -> a
// BUT:
// partial unfolding is not Ok
let projX'' (V x) = fst x
// consequently also doesn't work
let projX''' x =
match x with
| V y -> fst y
कारण यह है कि एक आंशिक रूप से deconstructed प्रकार के खिलाफ मैच के लिए यह असंभव बना देता है क्या है?
कुछ आंशिक deconstructions ठीक होने लगते हैं:
// Works
let f (x,y) = fst y
संपादित करें: ठीक है, मैं अब (अपने जवाब & टिप्पणी के लिए धन्यवाद) व्यवहार वर्णित की "तकनीकी" कारण समझते हैं। हालांकि, मुझे लगता है कि भाषा के अनुसार, इस व्यवहार को शेष भाषा की तुलना में थोड़ा "अप्राकृतिक" लगता है:
"बीजगणितीय", मेरे लिए, यह प्रकार से "टी" प्रकार को अलग करने के लिए अजीब लगता है "(टी) "। ब्रैकेट्स (इस संदर्भ में) उदाहरण के लिए उदाहरण देने के लिए उपयोग किया जाता है जैसे उदा। में "(टी * एस) * आर" बनाम "टी * (एस * आर)"। इसके अलावा FSI जवाब तदनुसार, कि क्या मैं
type Vector = (int * int)
या
type Vector = int * int
भेज FSI के लिए, इस सवाल का जवाब हमेशा होता है
प्रकार वेक्टर = int * पूर्णांक
को देखते हुए उन अवलोकन, एक निष्कर्ष निकाला है कि "int * int" और "(int * int)" बिल्कुल वही प्रकार और टी दर्शाता है hus कि कोड के किसी भी हिस्से में एक की सभी घटनाओं को दूसरे के साथ बदल दिया जा सकता है (रेफरी। पारदर्शिता) ... जैसा कि हमने देखा है वह सच नहीं है।
आगे यह महत्वपूर्ण लगता है कि हाथ में व्यवहार की व्याख्या करने के लिए, हमें भाषा के अर्थपूर्ण गुणों के बजाय "कुछ कोड कैसे संकलन के बाद दिखता है" के बारे में बात करना पड़ा, जो इमो इंगित करता है कि कुछ " भाषा अर्थशास्त्र के बीच तनाव "एक संकलक वास्तव में क्या करता है।
कंपाइलर सामग्री के लिए वास्तविक ट्यूपल का उपयोग करने के लिए इसे 'प्रकार वेक्टर = वी (फ्लोट * फ्लोट)' के साथ आज़माएं। – kvb
यह काम करता है! ... लेकिन यह कैसे अंतर कर सकता है ... मेरा मतलब है प्रकार वेक्टर = (फ्लोट का वी) * फ्लोट वैध भी नहीं होगा? –
सवाल यह है: क्या x * y' का मतलब है "वी प्रकार x और y के प्रकारों का एक टुपल रखता है" या "वी के प्रकार के दो अलग-अलग फ़ील्ड x और y" हैं? यदि आप ट्यूपल को संश्लेषित नहीं करते हैं तो संकलक बाद वाले को मानता है, लेकिन यदि आप इसे संश्लेषित करते हैं, तो इसका मतलब है पूर्व। यह भेद मुख्य रूप से अन्य .NET भाषाओं के साथ इंटरऑप के लिए महत्वपूर्ण है, लेकिन जैसा कि आपने पाया है कि यह कुछ परिस्थितियों में F # के भीतर इस प्रकार के मानों के साथ कैसे बातचीत करता है, यह भी प्रभावित कर सकता है। आपकी टिप्पणी के लिए – kvb