मैं aether लाइब्रेरी देख रहा हूं और इस पर गौर किया

 type Lens<'a,'b> =
    ('a -> 'b) * ('b -> 'a -> 'a)

 static member (^=) (Set, (_, s): Lens<'a,'b>) =
            fun (b: 'b) ->
                s b : 'a -> 'a

^= फ़ंक्शन में, b पैरामीटर यदि लैम्ब्डा में 'b' प्रकार का है। हालाँकि, लैम्डा बॉडी में, b प्रकार 'a अभी' क्यों है?

f#
3
user3587180 14 जुलाई 2017, 22:09

2 जवाब

सबसे बढ़िया उत्तर

हालाँकि, लैम्डा बॉडी में, b प्रकार 'a अभी' क्यों है?

यह नहीं।

b एक इनपुट है जिसे 'b टाइप किया गया है, जैसा कि fun (b: 'b) -> में दिखाया गया है।

हम उस सदस्य को मैचों के बिना फिर से लिख सकते हैं, और स्थानीय रूप से परिभाषित फ़ंक्शन का उपयोग कर सकते हैं, जैसे:

static member (^=) (Set, lens: Lens<'a,'b>) =
    // Pattern match to extract out the 2nd portion of the lens, which is a function: 'b -> 'a -> 'a
    let (_,s) = lens

    // Define a function that takes a 'b and returns a new function of type: 'a -> 'a
    let fn (b: 'b) : 'a -> 'a =
        s b // this just partially applies s with the input "b"
    fn // Return the function

मूल रूप से, तर्क सूची में (Set, (_,s)) "s" को Lens<'a,'b> के दूसरे भाग या ('b -> 'a -> 'a) टाइप किए गए फ़ंक्शन से बांधता है। ऊपर, मैंने इसे और अधिक स्पष्ट होने के लिए तोड़ा है, और इस निष्कर्षण को अपने स्वयं के बंधन में किया है।

सदस्य तब स्थानीय रूप से परिभाषित फ़ंक्शन (लैम्ब्डा के रूप में) देता है। ऊपर, मैंने फिर से लिखा है कि एक लेट बाउंड फ़ंक्शन का उपयोग करना, क्योंकि यह अक्सर अधिक स्पष्ट होता है।

4
Reed Copsey 14 जुलाई 2017, 22:48

मुझे लगता है कि आप सिंटैक्स को गलत तरीके से पढ़ रहे हैं। कोड s b : 'a -> 'a का अर्थ यह नहीं है कि b 'a प्रकार का है।

इसे पढ़ने का सही तरीका यह है कि इसे दो भागों में विभाजित किया जाए: बृहदान्त्र से पहले का भाग अभिव्यक्ति है, और बृहदान्त्र के बाद का भाग उस अभिव्यक्ति का प्रकार है।

तो कोड s b : 'a -> 'a का वास्तव में मतलब है कि s b 'a -> 'a प्रकार का है। यह व्यक्तिगत रूप से s या b के प्रकारों के बारे में कुछ नहीं कहता है।

4
Fyodor Soikin 14 जुलाई 2017, 22:56