問題タブ [netwire]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Haskell Netwire: ワイヤーのワイヤー
FRP の感触をつかもうとして netwire パッケージをいじっていますが、簡単な質問があります。
次の単純なワイヤーから始めて、5 秒ごとに (約) イベントを発行できます。
これは非常に素晴らしく簡単ですが、次にやりたいことは、生成された各イベントをワイヤーにマップして、更新を監視できるようにすることです。次のようなアキュムレータ関数があります。
次に、イベントのトリガーが開始されるまで禁止する新しいワイヤを導入しeventList
ます。次のようにします。
だから私はイベントからワイヤのリストを含むワイヤに行きました。最後に、これらの各ワイヤをステップ実行して結果のリストを生成するワイヤを導入します。
最後に、すべてをテストするためのメイン ルーチンがあります。
私が期待しているのは、リスト内の各要素が 10 秒間の作成時間を示し、その後、要素がゼロを表示する、成長するリストです。私が代わりに得ているのは、静的値のリストの増加です。たとえば、いくつかの手順を実行すると、次のようになります。
等々。私が実際に見ているのは、
したがって、アキュムレータ関数が機能していることはわかっています。作成されたすべてのイベントがワイヤに変換されています。しかし、私が見ていないのは、これらのワイヤが時間の経過とともに異なる値を放出していることです。私のステートメントfor 10 . pure x --> pure 0
は、時間が経過した後、それらを 0 を発行するように切り替える必要があります。
私はまだFRPに慣れていないので、何か重要なことを根本的に誤解している可能性があります(おそらくそうです).
collision - Netwire 5 - ボックスが跳ね返らない
OpenGL を使用して、課題 3 ( https://ocharles.org.uk/blog/posts/2013-08-01-getting-started-with-netwire-and-sdl.html ) を netwire 4.0 から netwire 5.0に変換しようとしています。 . 残念ながら、箱は跳ねません。コード全体は次のとおりです。関数速度が機能しないようです。箱が壁にぶつかると跳ねずに止まります。プログラムを修正するにはどうすればよいですか? 前もって感謝します。
haskell - Haskell で書かれたゲームの最小限の例は何ですか?
三ヶ月ぶりの更新
I /O に Arrows と Kleisli Arrows を使用した Functional Reactive Programming の構造で、netwire-5.0.1
+を使用して以下の回答があります。sdl
「ゲーム」と呼ぶには単純すぎますが、非常に構成可能で、非常に拡張可能でなければなりません。
オリジナル
私はちょうど Haskell を学んでいて、それから小さなゲームを作ろうとしています。ただし、小さな(正規の)テキストゲームがどのような構造になるかを確認したいと思います。また、コードをできるだけ純粋に保つようにしています。私は今、実装方法を理解するのに苦労しています:
- メインループ。ここに例があります Haskellでゲームループを書くにはどうすればよいですか? しかし、受け入れられた答えは末尾再帰ではないようです。これが重要かどうかは正確にはわかりません。私の理解では、メモリ使用量は増えますよね?
- 状態遷移。しかし、これは最初のものとかなり関連していると思います。とhttp://www.gamedev.net/page/resources/_/technical/game-programming/haskell-game-object-design-or-how-functions-can-get-you
State
_ -apples-r3204ですが、個々のコンポーネントが機能し、有限の手順で更新される可能性がありますが、無限ループでどのように使用できるかわかりません。
可能であれば、基本的に次の最小限の例を見たいと思います。
- プレーヤーに何かを繰り返し入力するように求めます
- 何らかの条件が満たされると、状態が変化します
- 他の条件が満たされた場合、終了します
- 理論的には、メモリを吹き飛ばすことなく無限に実行できます
非常に基本的なものを取得できないため、投稿可能なコードはありません。私がウェブ上で見つけた他の資料/例は、他のライブラリを使用したり、イベントを推進しSDL
たりします。GTK
私が見つけた完全にHaskellで書かれた唯一のものはhttp://jpmoresmau.blogspot.com/2006/11/my-first-haskell-adventure-game.htmlですが、それはメインループの末尾再帰のようには見えませんも(繰り返しますが、それが重要かどうかはわかりません)。
それとも、Haskell はこのようなことを意図していないのでしょうか? main
または、おそらくCに入れるべきですか?
編集 1
だから私はhttps://wiki.haskell.org/Simple_StateT_useの小さな例を修正し、それをさらに単純にしました(そしてそれは私の基準を満たしていません):
ただし、最終的にはメモリがオーバーフローします。でテストしました
メモリ使用量は直線的に増加し始めます。
編集 2
わかりました、 Haskell の再帰とメモリ使用量を見つけ、「スタック」についてある程度理解しました...私のテスト方法に何か問題はありますか?
haskell - Netwire でのコンソールの対話性は?
私はNetwire
haskell ライブラリでテストしており、単純なtime
ワイヤで動作するようにしました:
注:run
は基本的に から変更されてtestWire
いるため、ワイヤ ネットワークを形成する正しい方法であるかどうかはわかりません。http://todayincode.tumblr.com/post/96914679355/almost-a-netwire-5-tutorialのコードの一部ですが、そのチュートリアルではイベントについては言及されていません。
今、私はプログラムに少し対話性を追加しようとしています. ここでは、いずれかのキーが押されたらプログラムを終了します。イベントの切り替えを行う必要があると思います。wire'
ただし、動作を変更または切り替える方法が見つからないため、ここで立ち往生しています。API ドキュメントとソースを読み込もうとしましたが、実際にイベントを「起動」する方法や、それを使用してワイヤを切り替える方法がわかりません。
繰り返しますが、私はまだ Haskell にあまり慣れていないので、ここで大きな愚かな間違いを犯した可能性があります。
更新 1/2
次のコードで目標を達成しました。キーを押すとタイマーが停止します。更新 2pollInput
別のIO
唯一の機能に分離することができました。
ただし、これにはさらにいくつかの疑問が生じます。まず、これは良い習慣ですか?第二に、の型はpollInput
何ですか?手動で入力しようとしましたが、成功しませんでした。ただし、自動型推論は機能します。
これは、このコードがどのように機能するかについての私の説明です:
最初に、コンソールからのユーザー入力がポーリングされ、いくつかのロジックの後、ワイヤーへの「入力」が生成され (名前の選択は適切ではありませんが、生成された入力はワイヤー入力です)、ネットワークに渡されます。ここでは、単純に禁止 ( Left something
) を渡し、ループを終了させます。もちろん、終了するとき、プログラムは改行を生成して、コンソールの見栄えを良くします。
(まぁ、仕組みはまだわかりませんEvent
が)
3/4更新
@Cirdec の回答を読んだ後、エディターで多くの操作を行った後、このシングル スレッド バージョンを なしIORef
で取得し、'x' Update 4を押すと終了します。(ただし、何も出力されません):
これは私のオリジナルよりもはるかに優れていると思いますが、それが良い習慣であるかどうかはまだ完全には確信が持てません.
haskell - Haskell Netwire: 適切に行われたワイヤーのワイヤー
「適切に」netwire 5に動的なワイヤセットを実装しようとしています。私はワイヤーのワイヤーの質問への回答を読みましたが、例のコードが動作に変換されて、の1回の実行でEvent
空でないことを示す方法に依存する方法が特に好きではありません.stepWire
Event
したがって、 s を介して動的セットにワイヤを追加および削除したいと考えていUnsafe.Event
ます。Wire
簡単にするために削除部分を削除し、 sを追加できるようにしましょう。
各イベントは、内部に隠されているワイヤーの (最初は空の) リスト (または他のセット) に新しいワイヤーを追加し、それらはすべて実行され、すべて type の入力を取得し、a
それらの出力をリストに収集します。
実行部分は比較的簡単で、グーグルで検索できる例があります。
上記の例はイベントを無視します。event
関数 from以外では、遷移関数内でイベントを使用することは不可能であると思われUnsafe.Event
ます。あれは正しいですか?避けたいUnsafe.Event
。
一歩下がって、推奨されているイベントの使用方法を確認すると、非常に有望な関数が表示されます。
さて、単純化された runWires から始めるとどうなるでしょうか:
dynWireSet を krSwitch にします。
私はほとんどそこにいます!ここで、新しいワイヤーをに挿入するfmap
だけでよければ、準備は完了です。しかし、これは一般的なケースでは不可能です。実際、私が正しく理解すれば、出力のすぐ上にあります。使い物にならない。(:)
runWires2
newwires
fmap
WGen
fmaps
そして今、ここに私の考えがあります。の新しいバリアントを紹介しましょう。内部状態を異なるデータ型で保持するため、data Wire
暫定的に呼び出します。WCarry g st
その遷移関数はタイプになります
そして、初期状態が与えられると、コンストラクターは次のような Wire を生成します。
結果のワイヤーにWCarry
タイプの代わりにタイプを導入するだけです。の観点WGen
から再定式化するのは簡単です。runWires
mkCarry
次に、fmap インスタンスは次のようになります。
これにより、「hidden inside」状態オブジェクトが変更さkrSwitch
れ、この種の s で function を有意義に使用Wire
して、以前の値を失うことなく内部状態を微調整できるようになります。
これは理にかなっていますか?私がやろうとしていることがより簡単な方法で可能であれば、アドバイスをお願いします! 私が話していることが理にかなっている場合、どうすればそれを行うことができますか? WCarry を使用して定義をローカルに拡張し、data Wire
対応する定義を持つ興味深い Class インスタンスを拡張して追加することは可能ですか? 他にアドバイスはありますか?
ありがとう。
haskell - Netwire との衝突を実装する方法 (5.0.1)
Netwire を使用して移動オブジェクトをモデル化しようとしていますが、ボールが壁から跳ね返るようなものを実装するための推奨される方法を知りたいと考えています。これを行うためのいくつかの可能な方法に遭遇しましたが、実際にそれらを機能させるにはいくつかの助けが必要です。
モーション コードは次のようになります。
特定の位置 (x=20 など) で跳ね返る速度矢印を作成するには、どのような方法が推奨されますか?
私はこれを行うことができるかもしれない3つの異なる方法を見てきました:
最も単純に見えるnetwire
/li>-->
関数。この関数を使用したプロトタイプがありますが、衝突時の速度に基づいて新しい速度矢印を作成する方法がわかりません。オブジェクトが加速できる場合は役に立たない固定値しか使用できません。Netwireで
Event
とを使用します。switch
これの使い方がわかりません。(|||)
一般的に矢印で使用できる機能を使用します。
最初の 2 つは最良のオプションのように思えますが、それらを実装する方法がわかりません。
これと同様の質問を他にも見ましたが、ネットワイヤの異なるバージョン間の非互換性により、回答が役に立たなくなりました。