जैसा कि टेलस्टीन ने कहा: तकनीकी रूप से, हाँ, जब तक कि आपकी भाषा में कोई तरीका नहीं है, यह गारंटी देने के लिए कि इनपुट फ़ंक्शन भी शुद्ध है।
यह काल्पनिक नहीं है, इसकी गारंटी देने के लिए वास्तव में अच्छे तरीके हैं। कम से कम एक जोरदार टाइप की हुई भाषा में।
ऐसा शुद्ध ~ फंक्शन जिसे आप जावास्क्रिप्ट में लिखेंगे
function foo(f) {
return f(1) + 2;
}
हास्केल को सीधे अनुवाद किया जा सकता है:
foo :: (Int -> Int) -> Int
foo f = f 1 + 2
अब, जावास्क्रिप्ट में आप जैसे बुराई सामान कर सकते हैं
js> foo (function(x) {console.log("muharhar"); return 0})
muharhar
2
हास्केल में यह संभव नहीं है । कारण, कुछ साइड-इफ़ेक्ट-फुल जैसे console.log()हमेशा एक परिणाम प्रकार होना चाहिए IO something, न कि केवल somethingअकेले।
GHCi> foo (\x -> print "muarhar" >> return 0)
<interactive>:7:12:
Couldn't match expected type ‘Int’ with actual type ‘IO b0’
In the expression: print "muarhar" >> return 0
In the first argument of ‘foo’, namely
‘(\ x -> print "muarhar" >> return 0)’
In the expression: foo (\ x -> print "muarhar" >> return 0)
इस अभिव्यक्ति को टाइप करने के लिए, हमें fooटाइप सिग्नेचर देना होगा
foo :: (Int -> IO Int) -> Int
लेकिन यह पता चला है कि मैं इसे अब और लागू नहीं कर सकता: क्योंकि तर्क फ़ंक्शन के IOपरिणाम में है, मैं इसका उपयोग नहीं कर सकता foo।
<interactive>:8:44:
Couldn't match expected type ‘Int’ with actual type ‘IO Int’
In the first argument of ‘(+)’, namely ‘f 1’
In the expression: f 1 + 2
एक ही रास्ता मैं एक इस्तेमाल कर सकते हैं IOमें कार्रवाई fooहै यदि का परिणाम fooटाइप है IO Intही:
foo :: (Int -> IO Int) -> IO Int
foo f = do
f1 <- f 1
return (f1 + 2)
लेकिन इस बिंदु पर यह स्पष्ट है fooकि यह एक शुद्ध कार्य नहीं है।
foo = function(function bar){ print(bar.toString()) }