যেমন টেলাস্টিন বলেছেন: প্রযুক্তিগতভাবে, হ্যাঁ, যদি না আপনার ভাষায় গ্যারান্টি দেওয়ার কোনও উপায় না থাকে যে ইনপুট ফাংশনটিও খাঁটি।
এটি কাল্পনিক নয়, এটির নিশ্চয়তা দেওয়ার ভাল উপায় রয়েছে। কমপক্ষে দৃ strongly়ভাবে টাইপ করা ভাষায়।
যেমন একটি খাঁটি ~ ফাংশন আপনি জাভাস্ক্রিপ্ট হিসাবে লিখতে চাই
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()) }