Last active
August 29, 2015 14:11
-
-
Save ajiyoshi-vg/c48c24221cdeca953043 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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