जैसा कि टेलस्टीन ने कहा: तकनीकी रूप से, हाँ, जब तक कि आपकी भाषा में कोई तरीका नहीं है, यह गारंटी देने के लिए कि इनपुट फ़ंक्शन भी शुद्ध है।
यह काल्पनिक नहीं है, इसकी गारंटी देने के लिए वास्तव में अच्छे तरीके हैं। कम से कम एक जोरदार टाइप की हुई भाषा में।
ऐसा शुद्ध ~ फंक्शन जिसे आप जावास्क्रिप्ट में लिखेंगे
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()) }