Skip to content

Instantly share code, notes, and snippets.

@RobertDober
Last active March 25, 2022 20:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RobertDober/59933f07615efa8b341e123ee8388c4e to your computer and use it in GitHub Desktop.
Save RobertDober/59933f07615efa8b341e123ee8388c4e to your computer and use it in GitHub Desktop.
Improver from Y-NOT RIP Jim
fx =
(fn improver -> improver.(improver) end)
.( fn improver -> fn n -> if n == 0, do: 1, else: n * improver.(improver).(n-1) end end )
iex(15)> fx = fn gen ->
...(15)> gen.(gen)
...(15)> end.(
...(15)> fn gen ->
...(15)> fn n ->
...(15)> fn partial ->
...(15)> fn n -> if n == 0, do: 1, else: n * partial.(n-1) end
...(15)> end.( gen.(gen)).(n)
...(15)> end
...(15)> end)
iex(19)> fact_improver = fn partial -> fn n -> if n < 2, do: n, else: n*partial.(n-1) end end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(20)> y = fn improver -> fn gen -> gen.(gen) end.(
...(20)> fn gen -> fn n -> improver.(gen.(gen)).(n) end end
...(20)> ) end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(21)> fact = y.(fact_improver)
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(22)> fact.(5)
120
# The final, textbook form:
iex(24)> y = fn f ->
...(24)> fn g -> fn n -> f.(g.(g)).(n) end end.(
...(24)> fn g -> fn n -> f.(g.(g)).(n) end end )
...(24)> end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(25)> fibo_improver = fn partial ->
...(25)> fn n -> if n < 2, do: n, else: partial.(n-1) + partial.(n-2) end
...(25)> end
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(26)> fibo = y.(fibo_improver)
#Function<44.65746770/1 in :erl_eval.expr/5>
iex(27)> fibo.(2)
1
iex(28)> fibo.(3)
2
iex(29)> fibo.(4)
3
iex(30)> fibo.(6)
8
iex(31)> fibo.(8)
21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment