関数型プログラミング言語で(一般に)状態を処理する一般的な手法はありますか?グローバル状態を処理するためのすべての(機能的な)プログラミング言語には解決策がありますが、できる限りこれを避けたいと思います。
純粋に機能的な方法でのすべての状態は、機能パラメーターです。そのため、特定の入力またはトリガーで世界を操作するすべての関数のパラメーターとして、ゲーム全体の状態(世界、プレイヤー、ポジション、スコア、アセット、敵などの巨大なハッシュマップ)を配置する必要があります。関数自体は、gamestate blobから関連情報を選択し、それを使用して、gamestateを操作し、gamestateを返します。しかし、これは問題に対する貧弱な解決策のように見えます。ゲームステート全体をすべての関数に入れた場合、グローバル変数や命令型アプローチとは対照的に、私にとってメリットはありません。
関連する情報だけを関数に入れて、指定された入力に対して実行されるアクションを返すことができます。そして、1つの関数がすべてのアクションをgamestateに適用します。しかし、ほとんどの機能には多くの「関連する」情報が必要です。move()
オブジェクトの位置、速度、衝突のマップ、すべての敵の位置、現在のヘルスなどが必要です。したがって、このアプローチも機能しないようです。
私の質問は、関数型プログラミング言語で膨大な量の状態をどのように処理するのか、特にゲーム開発の場合ですか?
編集: Clojureでゲームを構築するためのゲームフレームワークがいくつかあります。この問題を部分的に解決するアプローチは、ゲーム内のすべてのオブジェクトを「エンティティ」としてスレッド化し、巨大なバッグに入れることです。ギガント主な機能は、画面を保持しているし、エンティティとハンドルイベント(:on-key-down
、:on-init
このエンティティのため、...)とは、メインディスプレイのループを実行します。しかし、これは私が探しているクリーンなソリューションではありません。
move()
、あなたはおそらく「現在の」オブジェクト(またはその識別子)に加えて、それが通過する世界を渡して、単に現在の位置と速度を導出する必要があります...出力は物理世界全体、または少なくとも変更されたオブジェクトのリスト。