स्कैला के दुखद तथ्यों में से एक यह है कि पुनरावर्ती प्रकार उपनाम समर्थित नहीं हैं। आरईपीएल में निम्न कार्य निम्नलिखित पैदावार:
scala> type WalkFn = Function[Int, WalkFn]
<console>:7: error: illegal cyclic reference involving type WalkFn
type WalkFn = Function[Int, WalkFn]
^
एक और टिप्पणी है कि स्काला आप संदर्भ द्वारा मूल्यों को संशोधित करने की अनुमति नहीं है (आम तौर पर की बात है, अस्वीकार, कार्यात्मक-प्रोग्रामिंग-प्रतिमान में पूरी तरह से घृणा सिकोड़ी)।
हालांकि, निराश मत हो! अन्य विकल्प हैं। लक्षण स्वयं-रेफरेंसियल हो सकते हैं, और कार्य स्काला में कक्षाएं हैं। तो हम लक्षणों के साथ सामान्य रिकर्सिव WalkFn मॉडल कर सकते हैं। इसके अलावा, हम अपरिवर्तनीय मूल्यों को गले लगा सकते हैं और हमारे कार्य को संदर्भ द्वारा पैरामीटर को म्यूट करने के बजाय अगली प्रगति को वापस कर सकते हैं।
के बाद से निम्नलिखित चक्रीय संदर्भ शामिल हैं (WalkForward -> WalkBackward, WalkBackward -> WalkForward, आदि), तुम इतनी स्काला संकलक सभी संकलन होगा स्केला में :paste
टाइप करने के लिए REPL
पहले निम्न उदाहरण (चल करने की आवश्यकता होगी एक कदम में 3 Walk{Forward,Backward,Equal}
कार्यान्वयन
पहले:।
import scala.util.Random
object Helpers {
def pickRandom[A](items: A*) =
items(Random.nextInt(items.length))
}
trait WalkFn extends (Int => (Int, WalkFn)) {}
object WalkForward extends WalkFn {
def apply(i: Int) =
(i + Random.nextInt(6),
Helpers.pickRandom(WalkEqual, WalkBackward))
}
object WalkEqual extends WalkFn {
def apply(i: Int) =
(i + (Random.nextInt(7) - 3),
Helpers.pickRandom(WalkForward, WalkBackward))
}
object WalkBackward extends WalkFn {
def apply(i: Int) =
(Random.nextInt(6) - 3,
Helpers.pickRandom(WalkEqual, WalkForward))
}
def doWalk(count: Int, walkFn: WalkFn = WalkEqual, progress: Int = 0): Unit =
if (count > 0) {
val (nextProgress, nextStep) = walkFn(progress)
println(nextProgress)
doWalk(count - 1, nextStep, nextProgress)
}
doWalk(20)
0123:
$ scala
Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_05).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
अब, कोड पेस्ट
फिर, प्रति निर्देश, ctrl-D
मारा।
कार्यात्मक शराबी स्टैगर का आनंद लें!
अच्छा जवाब है, लेकिन (नहीं * अभी तक * स्कैला से परिचित होना): आपको 'हेल्पर्स' ऑब्जेक्ट की क्या आवश्यकता है? क्या यह सिर्फ एक नामस्थान है, या क्या कोई सम्मेलन आपको शीर्ष-स्तर 'def'inition बनाने से रोकता है? – Bergi
@ बर्गि सभी 'def'' स्केल में विधियां हैं (वे स्पष्ट रूप से/स्पष्ट रूप से ईटा-विस्तार द्वारा फ़ंक्शन ऑब्जेक्ट्स में परिवर्तित हो रहे हैं)। इसलिए कुछ ऑब्जेक्ट को कुछ ऑब्जेक्ट के अंदर रखा जाना चाहिए। वैसे, स्कैला आरईपीएल (और अंतर्निर्मित दुभाषिया स्वयं) सिंथेटिक ऑब्जेक्ट बनाता है, ताकि आप आरईपीएल पाश के अंदर विधियों को परिभाषित कर सकें, लेकिन आम तौर पर लोगों को बिना किसी बदलाव के स्केलैक द्वारा संकलित करने के लिए कोड तैयार करने के लिए ऑब्जेक्ट्स का उपयोग किया जाता है। – dk14