Y combinator: Difference between revisions
Content deleted Content added
→{{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> |
<lang scala> |
||
def Y[A, B](f: (A => B) => (A => B)): A => B = { |
|||
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> |
|||
Example |
Example |
||
<lang scala> |
|||
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 |
fib(6) //> res1: Int = 8 |
||
</lang> |
|||
=={{header|Scheme}}== |
=={{header|Scheme}}== |