एक छोटा ज्ञात तथ्य यह है कि यदि आप पर्याप्त भाषा एक्सटेंशन (ghc) को चालू करते हैं तो Haskell एक गतिशील रूप से टाइप की गई भाषा बन जाती है! उदाहरण के लिए निम्नलिखित कार्यक्रम अतिरिक्त लागू करता है।
{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
data Zero
data Succ a
class Add a b c | a b -> c
instance Add Zero a a
instance (Add a b c) => Add (Succ a) b (Succ c)
यह वास्तव में किसी भी अधिक हास्केल की तरह नहीं दिखता है। वस्तुओं के संचालन के बजाय, हम प्रकारों पर काम करते हैं। प्रत्येक संख्या यह स्वयं का प्रकार है। कार्यों के बजाय हमारे पास टाइप कक्षाएं हैं। कार्यात्मक निर्भरताएं हमें उन्हें प्रकारों के बीच कार्यों के रूप में उपयोग करने की अनुमति देती हैं।
तो हम अपने कोड को कैसे लागू करते हैं? हम दूसरे वर्ग का उपयोग करते हैं
class Test a | -> a
where test :: a
instance (Add (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)
=> Test a
यह test
टाइप 4 + 3 के प्रकार को सेट करता है । यदि हम इसे ghci में खोलते हैं तो हम पाएंगे कि test
यह वास्तव में टाइप 7 का है।
Ok, one module loaded.
*Main> :t test
test :: Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))
कार्य
मैं चाहता हूं कि आप एक ऐसा वर्ग लागू करें जो दो पीनो अंकों (गैर-नकारात्मक पूर्णांक) को गुणा करता है। Peano अंकों का निर्माण उपरोक्त उदाहरण में समान डेटा प्रकारों का उपयोग करके किया जाएगा:
data Zero
data Succ a
और आपकी कक्षा का मूल्यांकन भी उसी तरह किया जाएगा जैसा कि ऊपर किया गया है। आप जो चाहें अपनी कक्षा का नाम दे सकते हैं।
आप किसी भी कीमत पर बाइट्स के लिए किसी भी ghc भाषा एक्सटेंशन का उपयोग कर सकते हैं।
परीक्षण के मामलों
ये परीक्षण मामले मान M
लेते हैं कि आपकी कक्षा का नाम है , आप चाहें तो इसे कुछ और नाम दे सकते हैं।
class Test1 a| ->a where test1::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ (Succ (Succ Zero))) a)=>Test1 a
class Test2 a| ->a where test2::a
instance (M Zero (Succ (Succ Zero)) a)=>Test2 a
class Test3 a| ->a where test3::a
instance (M (Succ (Succ (Succ (Succ Zero)))) (Succ Zero) a)=>Test3 a
class Test4 a| ->a where test4::a
instance (M (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))) (Succ (Succ (Succ Zero))) a)=>Test4 a
परिणाम
*Main> :t test1
test1
:: Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))
*Main> :t test2
test2 :: Zero
*Main> :t test3
test3 :: Succ (Succ (Succ (Succ Zero)))
*Main> :t test4
test4
:: Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ
(Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))))))))
तकनीकी साक्षात्कार टाइपिंग से प्रेरणा मिलती है