Javascript、Haskellなどの関数型言語で再帰呼び出しをトレース/理解するのはやや快適ですが、最近私はScalaでコースを取っていますが、現在コースは再帰に大いに依存しています。直感的に再帰が理解できるようだが、私はbase case
は完全に罰金感じているのに対し、一般的なケースを広げ苦労しておりますがOOPで再帰呼び出しをトレースする
abstract class IntSet {
def incl(x: Int): IntSet
def contains(x: Int): Boolean
def union(other: IntSet): IntSet
}
class Empty extends IntSet {
def contains(x: Int): Boolean = false
def incl(x: Int): IntSet = new NonEmpty(x, new Empty, new Empty)
def union(other: IntSet): IntSet = other
}
class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {
def contains(x: Int): Boolean =
if (x < elem) left contains x
else if (x > elem) right contains x
else true
def incl(x: Int): IntSet =
if (x < elem) new NonEmpty(elem, left incl x, right)
else if (x > elem) new NonEmpty(elem, left, right incl x)
else this
def union(other: IntSet): IntSet =
((left union right) union other)incl(elem)
}
:ここ
は簡単な例です。
((left union right) union other)incl(elem)
通常、通常の機能的言語には存在しない左参照コンテキストのためです。これらの再帰呼び出しで作業して理解しながら、自分を快適にする方法を教えてください。
私は再帰ツリーを展開する一連のコールだろう以下だと思う回答に基づいて更新
。
incl(union(union(left, right), other), elem)
incl(union(incl(union(union(left, right), other), elem), other), elem)
しかし、私はそれは非常にすぐにあまりにも毛深いなると思いますが、これを理解するために任意の絵の代替またはモーダルはありますか?
通常の機能言語*には存在しない左参照コンテキストのために「*」とはどういう意味ですか? 「通常の」関数型言語とは何ですか?その関数はどのように表示されますか? – Bergi
@Bergi私は通常、関数foo(largeInstance) - >関数foo(smallerInstance)を行います.... function foo(baseCase) 'つまり、私の関数呼び出しは引数だけに依存しますが、関数はオブジェクトに依存していますこの関数は呼び出されます。 – CodeYogi
常に存在する暗黙の引数として関数が呼び出されるオブジェクトを考えてください(特にScalaでは特に使用されるわけではありません)。 'incl(union(union(left、right)、other)、elem)'のように。最初の引数では、すべての関数だけが多態的です。 –