26

私はできるだけ機能的なパラダイムに固執することを好み、脳がチャレンジに向けて準備を整えているときは、純粋に機能的なパラダイムにできるだけ近づけることを好みます。可能な限り F# を使用します。通常、私は VB.NET か C# (運が悪い場合は VBA) のどちらかで行き詰っています。そのため、私の言語では、関数型のアプローチからかなり離れることを許されています。

歴史的に、私は結果が得られるまで、ログ記録とユーザーとの通信を無視してきました。ユーザーを待つだけです。現在、ログやステータス バーの更新を実装しようとしています。私の言語ではいつでも標準出力に書き込むことができるので、簡単です。しかし、純粋に機能的な観点から、機能の内部で何が起こっているかについての情報を外の世界に漏らすにはどうすればよいでしょうか? 計算中にログを記録したり、ユーザーと通信したりすることは、純粋に機能的なアプローチに反するだけですか?

Haskell では、Monad を使用すると確信しています。他の言語を使用する場合はどうなりますか?

ありがとう。

4

2 に答える 2

5

関数型プログラミングは初めてですが、Scala での試みは次のとおりです。

object FunctionalLogging {

  type Result = Int

  class ResultWithLogging(val log: List[String], val result: Result) {}

  def functionWithLogging(log: List[String], arg: String): ResultWithLogging = {
    def function(arg: String): Result = arg.length

    new ResultWithLogging(log :+ ("Calling function(" + arg +")"), function(arg))
  }

  val result = functionWithLogging(List(), "Hello world!")

  // -- Pure functional code ends here --
  println("Result = " + result.result)
  println("Log = " + result.log)
}

副作用がないという点で機能的ですが、明らかにログは関数の引数と戻り値の一部であるため、あまりエレガントでも実用的でもありません。

定義上、ロギングは望ましい副作用であるように思われるので、私の定義に沿って進むと、機能しないコードを機能するコードからどのように分離するかが問題になります。実際には、私はおそらく Scala オブジェクト (おそらくシングルトンに似すぎている - 特性はおそらく Scala の方が優れている) から始めるか、ロギング メッセージを蓄積し、それらに対して必要なことは何でも行うアクターから始めるでしょう。

これはより実用的な見方です: Scala でのロギング

編集

この質問では、Haskell モナドと IO について説明しています。モナド以外に、純粋な関数型言語で状態を処理できる方法はありますか?

于 2012-12-07T22:08:59.117 に答える