• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:scalaで無限に続く関数を返したい)

scalaで無限に続く関数を返す方法

このQ&Aのポイント
  • Scalaで無限に続く関数を返す方法について教えてください。
  • 現在、Scalaを学んでいる初心者です。無限に続く関数を返す方法を知りたいです。
  • Schemeでは、無限に続く関数を返すことができますが、同じようにScalaでも可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まず、結論から言うと、それと全く同じものをScalaで実装するのは無理です。 というのは、Scalaでは、型A = () => Aみたいな循環した定義を直接的に実現する方法が 無いからです。ただし、それに近いことを次のようなコードで行うことはできます。 object F { class Link(f: () => Link) extends (() => Link) { def apply(): Link = f() } def f(): Link = { def n(x: Int): Link = { println(x) new Link(() => n(x + 1)) } n(0) } } ここで、Linkというクラスのコンストラクタに、() => Linkという自分自身の型を 返す関数を持たせることで、呼び出すと自分と同じ型が返ってくる関数のようなものを 疑似的に実現できるわけです。また、Linkクラスは() => Link型の関数を継承する ようにしているため、Linkクラスは() => Link型の関数として扱うことができます。 なお、このコードは、 import F._ f()()()()()()()()... のようにして利用することができます。

参考URL:
http://gist.github.com/393363
Vitaminles
質問者

お礼

ご回答、そしてご丁寧に例まで示して頂き、ありがとうございます。(返事が遅れてすみません。) なるほど、同じ物は作れないのですね。 関数から複雑な関数を返すときはクラスを利用する、といった感じですかね。 特にお考え無しにプログラムするとき、直感的に関数から関数を返すと言う私は、scalaでは関数言語の思考を変えなくてはならないですね。