Re:The Y Combinator in Go with generics
by khaledh on Sunday June 12, 2022 @11:32AM
(#31715257)
Thanks, that helps a bit. So I get the what: a way to make an anonymous function recursive. As for the why, it seems to me it's because "lambda calculus doesn't have named functions." So this tells me this is a programming language design concern, as opposed to a pattern that can be used in everyday programming. Based on this, providing examples of how to implement a Y combinator in Clojure, Python, and Go is of questionable value IMO. And that's OK, since a lot of things we do don't need to have practical value (e.g. learning, understanding, etc).
[ Parent
| on HN ]
Re:The Y Combinator in Go with generics
by _old_dude_ on Sunday June 12, 2022 @02:50PM
(#31717153)
It has practical value, let say you have something that caches the result of a lambda
record Cache<T, U>(Function<T, U> function) {
U get(T value) { ... }
}
you can use it that way var cache = new Cache<Integer, Integer>(v -> v + 1);
var result = cache.get(3);
with that settings, how do you specify a lambda which is recursive ? and how can you cache the intermediary steps if you can change the signature of get() ?In languages with closures it would be easy to set a variable to the lambda while that same variable is also captured by the lambda. In fact, this seems to happen once in a while in Go, since closures are always lambdas.
Even if it doesn't have value for everyday programming, translating it into Clojure/Python/Go/whatever can make it easier to understand. Most explanations I've seen of the Y combinator just work in lambda calculus, which I at least find somewhat difficult to read; translating it into a more familiar language can make it easier to understand.
Fixed-point combinator > Y Combinator, Implementations in other languages:
https://en.wikipedia.org/wiki/Fixed-point_combinator
Y-combinator in like 100 languages: https://rosettacode.org/wiki/Y_combinator #Python