हास्केल में, कई अन्य कार्यात्मक भाषाओं की तरह, फ़ंक्शन foldl
इस तरह परिभाषित किया गया है, उदाहरण के लिए, foldl (-) 0 [1,2,3,4] = -10
।रैकेट में अजीब तरीके से फोल्ड क्यों परिभाषित किया गया है?
यह ठीक है, क्योंकि foldl (-) 0 [1, 2,3,4]
परिभाषा के अनुसार, ((((0 - 1) - 2) - 3) - 4)
है।
लेकिन, रैकेट में, (foldl - 0 '(1 2 3 4))
2, क्योंकि रैकेट "समझदारी से" इस तरह की गणना करता है: (4 - (3 - (2 - (1 - 0))))
, जो वास्तव में है 2.
, अगर हम सहायक समारोह फ्लिप, इस तरह परिभाषित करते हैं:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
तो हम रैकेट में हास्केल में के रूप में ही व्यवहार को प्राप्त कर सकते हैं: (foldl - 0 '(1 2 3 4))
के बजाय हम लिख सकते हैं: (foldl (flip -) 0 '(1 2 3 4))
सवाल यह है: क्यों रैकेट में foldl
है इस तरह के एक विषम (गैर मानक और nonintuitive) तरीके से परिभाषित, किसी भी अन्य भाषा की तुलना में अलग?
एफडब्ल्यूआईडब्ल्यू, चेज़ स्कीम का 'फोल्ड-बाएं' आप जो उम्मीद कर रहे हैं उसके अनुरूप है: '(फोल्ड-बाएं - 0' (1 2 3 4)) '' -10' और '(फोल्ड-बाएं कॉन्स '()' (1 2 3 4)) '' है ((((()) 1)। 2)। 3)। 4) '। – erjiang