Skip to content

Instantly share code, notes, and snippets.

@ajiyoshi-vg
Last active August 29, 2015 14:11
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 ajiyoshi-vg/c48c24221cdeca953043 to your computer and use it in GitHub Desktop.
Save ajiyoshi-vg/c48c24221cdeca953043 to your computer and use it in GitHub Desktop.
#!/usr/bin/env escript
main(_) ->
is_even(),
ok.
% https://twitter.com/amutake_s/status/544342369605124096
% amutake_s: Erlang で関数の本体のなかで局所的に相互再帰な関数を定義する方法はありますか
%
% https://twitter.com/ajiyoshi/status/544345302153453568
% ajiyoshi: Yコンビネータみたいな感じの工夫をすればできると思うが、実用上そんなコトする必要はなく、単に名前ありの相互再帰関数を作ればよいと思う(名前を隠したければexportしなければよい)→ RT
%
% https://twitter.com/amutake_s/status/544347135622131712
% amutake_s: @ajiyoshi ありがとうございます。局所相互再帰がサポートされている言語のコードを Erlang に変換しようとしたときに困りまして、直接対応するものはあるのかなと思いつぶやきました。不動点コンビネータでやってみます。
%
% https://twitter.com/ajiyoshi/status/544349185525297152
% ajiyoshi: @amutake_s 私が思いついたのは、Yコンビネータそのものというか、相互再帰すべき関数を引数で渡してやって選ぶやり方 ( https://t.co/SJ1osDlyzl )ですが、読みづらいのでできれば避けたほうがいいと思います。この例はSICPの問題4.21の移植です。
%
% https://twitter.com/amutake_s/status/544351413229203456
% amutake_s: @ajiyoshi コード例ありがとうございます。まさにいま同じようなコードを書いていました。参考にさせていただきます。
is_even() ->
Evn = fun(Ev, Od, N) ->
case N of
0 -> true;
_ -> Od(Ev, Od, N-1)
end
end,
Odd = fun(Ev, Od, N) ->
case N of
0 -> false;
_ -> Ev(Ev, Od, N-1)
end
end,
io:format("~p is even? -> ~p~n", [10, Evn(Evn, Odd, 10)]),
io:format("~p is even? -> ~p~n", [9, Evn(Evn, Odd, 9)]),
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment