पर्ल 6 फ़ंक्शन को कम करता है और मेटाफ़ॉर्मर को कम करके अलग परिणाम देता है


12
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False

मेरा प्रश्न दो गुना है: सबसे पहले, कमी मेटाऑपरेटर <ऑपरेटर को अलग तरीके से क्यों संसाधित करता है ? ऐसा लगता है कि कमी का अनुमान अनुमानित रूप से एक चर का उपयोग करके किया गया है, जो कि सच्चे से असत्य के पहले परिवर्तन पर है, क्योंकि यह परिवर्तन बरकरार रखता है:

say [\<] @s;
# ----------
# (True True True False False False)

दूसरे, मैं इसे कम फंक्शन के अंदर भी इस्तेमाल करना चाहूंगा, यानी कम फंक्शन के घुंघराले कोष्ठक के अंदर कुछ कोड की शुरुआत करूंगा ताकि यह कमी मेटा ऑपरेटर के समान परिणाम दे। मैं यह कैसे कर सकता हूं? धन्यवाद।

जवाबों:


17

दोनों मेटा-ऑपरेटर और reduceखाते की संचालकता को ध्यान में रखते हुए उनके पास गए; मामले में <, ऑपरेटर पीछा कर रहा है।

कस्टम ब्लॉक पास करते समय, reduceइसके अंदर नहीं देख सकता है, और इसलिए यह बाएं-सहयोगी के डिफ़ॉल्ट पर वापस आ जाता है; फिर यह ब्यूडर के खिलाफ बाद के मूल्यों की तुलना करता है, जो कि रिड्यूसर से लौटा है, जो 0या के बराबर 1होता है, यही कारण है कि परिणाम अंत तक समाप्त होता है True

आप सहानुभूति प्राप्त कर सकते हैं जिसे आप अपनी कमी के कार्य को इच्छाशक्ति के अनुरूप होने के रूप में घोषित कर सकते हैं:

my @s1 =<1 2 3 2 3 4>;
my @s2 =<1 2 3 4>;
sub my-reducer($a, $b) is assoc('chain') {
    $a < $b
}
say reduce &my-reducer, @s1;    # False
say reduce &my-reducer, @s2;    # True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.