> On 28 Oct 2017, at 10:14 pm, John McCall <rjmcc...@apple.com> wrote:
> 
> 
>> On Oct 28, 2017, at 6:05 AM, Johannes Weiß via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> Hi Mike,
>> 
>>> On 27 Oct 2017, at 7:05 pm, Mike Kluev <mike.kl...@gmail.com> wrote:
>>> 
>>> on Date: Fri, 27 Oct 2017 17:52:54 +0100 Johannes Weiß 
>>> <johanneswe...@apple.com> wrote:
>>> 
>>>> On 27 Oct 2017, at 6:27 am, Howard Lovatt via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> In terms of recursion you can fiddle it:
>>>> 
>>>> struct RecursiveClosure<C> {
>>>>    var c: C! = nil
>>>> }
>>>> func factorial(_ n: Int) -> Int {
>>>>    var recursive = RecursiveClosure<(Int) -> Int>()
>>>>    recursive.c = { x in
>>>>        (x == 0) ? 1 : x * recursive.c(x - 1)
>>>>    }
>>>>    return recursive.c(n)
>>>> }
>>>> factorial(5) // 120
>>> 
>>> what a hack and a half :)
>>> 
>>> sorry, offtopic to the thread but that you can have easier with the 
>>> fixed-point combinator 
>>> (https://en.wikipedia.org/wiki/Fixed-point_combinator)
>>> 
>>> // the fixed-point combinator
>>> func fix<T>(_ f: @escaping ((@escaping (T) -> T) -> (T) -> T)) -> (T) -> T {
>>>    return { (x: T) in (f(fix(f)))(x) }
>>> }
>>> 
>>> // demo
>>> let fact = fix { fact_ in { n in n == 1 ? 1 : n * fact_(n-1) } }
>>> for i in 1..<10 {
>>>    print(fact(i))
>>> }
>>> 
>>> that would be a serious crime against humanity if swift allows this type of 
>>> code at all :-)
>> 
>> the fixed-point combinator and Y combinator are pretty important in 
>> functional languages.
> 
> They're important in the theory of functional languages.  Anyone seriously 
> promoting using the Y combinator in actual programming instead of using the 
> language's native recursive-binding features is, frankly, someone you should 
> not being taking advice from.

Definitely not arguing with that. But there are (valid?) cases when you want a 
recursive closure which doesn’t have a native recursion mechanism and then 
`fix` can be useful I’d argue. I think more straightforward than

>>>> recursive.c = { x in
>>>>        (x == 0) ? 1 : x * recursive.c(x - 1)
>>>>    }

. But fortunately have local functions, I can only recall wanting a recursive 
closure once.

— Johannes
> 
> John.
> 
>> And the above code works in Swift. The good thing is that you need to write 
>> `fix` only once and you can then use it for all closures that need to be 
>> recursive.
>> 
>> 
>> -- Johannes
>> 
>>> 
>>> Mike
>>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to