Jump to content

Y combinator: Difference between revisions

(Add bruijn)
Line 4,902:
 
=={{header|R}}==
<syntaxhighlight lang="r">Y <- function(f) {
#' Y = λf.(λs.ss)(λx.f(xx))
(function(x) { (x)(x) })( function(y) { f( (function(a) {y(y)})(a) ) } )
#' Z = λf.(λs.ss)(λx.f(λz.(xx)z))
}</syntaxhighlight>
#'
 
fixp.Y <- \ (f) (\ (x) (x) (x)) (\ (y) (f) ((y) (y))) # y-combinator.
<syntaxhighlight lang="r">fac <- function(f) {
fixp.Z <- \ (f) (\ (x) (x) (x)) (\ (y) (f) (\ (...) (y) (y) (...))) # z-combinator also.
function(n) {
}</syntaxhighlight>
if (n<2)
1
else
n*f(n-1)
}
}
 
Y-combinator test:
fib <- function(f) {
function(n) {
if (n <= 1)
n
else
f(n-1) + f(n-2)
}
}</syntaxhighlight>
 
<syntaxhighlight lang="r">for(i in 1:9) print(Y(fac)(i))
fac.y <- fixp.Y (\ (f) \ (n) if (n<2) 1 else n*f(n-1))
for(i in 1:9) print(Y(fib)(i))</syntaxhighlight>
fac.y(9) # [1] 362880
 
fib.y <- fixp.Y (\ (f) \ (n) if (n <= 1) n else f(n-1) + f(n-2))
fib.y(9) # [1] 34
}</syntaxhighlight>
 
Z-combinator test:
 
<syntaxhighlight lang="r">fac <- function(f) {
fac.z <- fixp.Z (\ (f) \ (n) if (n<2) 1 else n*f(n-1))
fac.z(9) # [1] 362880
 
fib.z <- fixp.Z (\ (f) \ (n) if (n <= 1) n else f(n-1) + f(n-2))
fib.z(9) # [1] 34
</syntaxhighlight>
 
You can verify these codes by [https://shinylive.io/r/editor/#code=NobwRAdghgtgpmAXGAZgSwB5wCYAcD2aEALgHQBOYANGAMb4lwlJgDEA5AAQCanAvJ0DdwClIAKQQGdSEiQEpxGUilEYMs2QB0IHTgC1+QkeKkz5gxcsEAvMatlX1WnVq3oMuUrwA8AWk4aNTlEUWSCAoLUI0JV1MMDRAE9okKDE6KTY1k4En3oYACMiKGJ8clJXTA99X394lNFwmKio6MakoPrG0m703qDu0nVQrKtc-AKikvJOKAAbCXxyiCcuAFcJOBcIFChaUgTOGrcPXga60MaIULQUIIgvACZQgEZOOHm4TggAKmUIH2ejm2u32ogAnMNOMBngBdTgAZgAbA8ABwogAMW3Q+X2hz8x08cQ6F3iV04NzuhwEgK+bw+nD+ANCAGoGaJ-k9NNs0DiEuDIdC4fCACxbVwgqx4hmVUj6M7E2p3a63dmPF50jZfX7splcnZ7Kz8zhZQUI5FozHLbk4yVHGVyxopS7KyleamhCAaz6Mmmsxmcio2o0m2EI0UQMAAXxhQA here]
 
=={{header|Racket}}==
2

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.