स्काला में, मैं परिभाषित कर सकते हैं एक Algebraic Data Type:प्रकार निर्माता के रूप में वापसी प्रकार
scala> sealed trait Maybe[A]
defined trait Maybe
scala> case class Just[A](x: A) extends Maybe[A]
defined class Just
scala> case object NothingHere extends Maybe[Nothing]
defined object NothingHere
यह एक समारोह, f
वापस जाने के लिए, Maybe[A]
की वापसी प्रकार के साथ संभव है।
scala> def f[A](x: A): Maybe[A] = Just(x)
f: [A](x: A)Maybe[A]
हालांकि, यह भी निर्दिष्ट करने के लिए है कि एक Just[A]
दिया जाता है संभव है।
scala> def f[A](x: A): Just[A] = Just(x)
f: [A](x: A)Just[A]
अब मैं हास्केल में समान व्यायाम करेंगे:
Prelude> data Option a = None | Some a deriving Show
Prelude> let f x = Some x :: Option Int
Prelude> f 10
Some 10
लेकिन, मैं एक प्रकार निर्माता की वापसी प्रकार निर्धारित नहीं कर सकते।
Prelude> let f x = Some x :: Some Int
<interactive>:10:21:
Not in scope: type constructor or class `Some'
A data constructor of that name is in scope; did you mean DataKinds?
Prelude> let f x = None :: None
सरल अंतर यह है कि स्काला के Just
एक वर्ग है, यानि कि एक वैध वापसी प्रकार है? जबकि, हास्केल में, प्रकार का निर्माता रिटर्न प्रकार नहीं हो सकता है?
ऐसे एक्सटेंशन हैं जो आपको _similar_ क्षमता देते हैं, लेकिन यह काफी महत्वपूर्ण है कि हास्केल के पास कोई सबक्लासिंग नहीं है, इसलिए आप सकारात्मक रूप से एक ही काम नहीं कर सकते हैं .. – leftaroundabout
@ बाएंराउंडबाउट ने शब्द को थोड़ा और बदल दिया ताकि यह स्पष्ट हो सके कि मैं था उन एक्सटेंशन का जिक्र करते हुए जो आपको रचनाकारों को प्रकार के स्तर पर अलग करने देते हैं, लेकिन यह स्कैला के समान नहीं है। सोचो अब यह और अधिक स्पष्ट बनाता है? – bheklilr