Y combinator: Difference between revisions

Content deleted Content added
JulianM (talk | contribs)
JulianM (talk | contribs)
→‎{{header|Scala}}: add type annotation
Line 4,459: Line 4,459:
=={{header|Scala}}==
=={{header|Scala}}==
Credit goes to the thread in [https://web.archive.org/web/20160709050901/http://scala-blogs.org/2008/09/y-combinator-in-scala.html scala blog]
Credit goes to the thread in [https://web.archive.org/web/20160709050901/http://scala-blogs.org/2008/09/y-combinator-in-scala.html scala blog]
<lang scala>def Y[A,B](f: (A=>B)=>(A=>B)) = {
<lang scala>
case class W(wf: W=>A=>B) {
def Y[A, B](f: (A => B) => (A => B)): A => B = {
def apply(w: W) = wf(w)
case class W(wf: W => A => B) {
def apply(w: W): A => B = wf(w)
}
}
val g: W=>A=>B = w => f(w(w))(_)
val g: W => A => B = w => f(w(w))(_)
g(W(g))
g(W(g))
}
}</lang>
</lang>
Example
Example
<lang scala>
<lang scala>val fac = Y[Int, Int](f => i => if (i <= 0) 1 else f(i - 1) * i)
val fac: Int => Int = Y[Int, Int](f => i => if (i <= 0) 1 else f(i - 1) * i)
fac(6) //> res0: Int = 720
fac(6) //> res0: Int = 720


val fib = Y[Int, Int](f => i => if (i < 2) i else f(i - 1) + f(i - 2))
val fib: Int => Int = Y[Int, Int](f => i => if (i < 2) i else f(i - 1) + f(i - 2))
fib(6) //> res1: Int = 8</lang>
fib(6) //> res1: Int = 8
</lang>


=={{header|Scheme}}==
=={{header|Scheme}}==