問題タブ [yampa]
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.
debugging - Haskell/Yampa と HOOD のゲーム オブジェクトのデバッグ出力
Haskell/Yampa (= Arrows) (HOOD を使用) を使用して、ゲーム オブジェクトのデバッグ出力を生成することに行き詰まっています。
私のエンジンは基本的に、レンダリングされる出力状態 (線、円) を生成するゲーム オブジェクトのリストを実行します。
プレイヤー オブジェクトは右に移動し、(配置された) 円として表されます。
mover は単純なインテグレータ (加速度 -> 速度 -> 位置) であり、速度を観察し、デバッグ出力として (位置付けされていない) ラインとしてレンダリングします。
ゲーム オブジェクト関数の内部値の追加のグラフィカル デバッグ出力を作成するにはどうすればよいですか?
最初に実際のオブジェクト (円) をレンダリングしますが、追加のデバッグ出力 (移動ベクトルを線として) もレンダリングします。おそらく HOOD でこれを達成できますが、まだ Haskell に堪能ではなく、私の場合に HOOD チュートリアルを採用する方法がわかりません。
haskell - ヤンパ/アニマのSF同士の依存関係でエンドレスループを防ぐ
この関数型リアクティブ プログラミングがどのように機能するかを理解しようとしていますが、問題が発生しました。私はboidシミュレーションを作成しようとしていますが、ゆっくりと始めています。今のところ、開始位置を取り、入力がポイントである位置から位置への信号関数を作成する関数としてboidを定義しましたに向かって移動しており、出力は現在の位置です。
seek 関数は 2 つの入力を取ります (ループのため)。現在位置と目標位置。次に、現在の位置からターゲット位置に向かって 50 の大きさ、つまり速度で指すベクトルを作成します。次に、速度が積分され、開始位置が追加されます。最終的に、信号は 2 つに分割されるため、1 つが出力になり、もう 1 つがシーク関数にループバックされます。
これで、次のようにボイドを定義できます。
ここで、aBoid は点 (500, 500) に向かってシークし、bBoid は aBoid に向かってシークします。
私の問題は、2つのボイドがお互いに向かってシークしたいときです。私がこれを行うとき:
プログラムは単に出力します:ProgramName: <<loop>>
これは、無限ループに入ることを意味すると思います。
私はまた、次のような関数を使用しようとしましたpar
:
ここで、route
関数は各boidの出力を別のboidの入力にマップするだけです( のようzip
に、ただしオフセットは1です)
これも<<loop>>
メッセージを与えます。
オブジェクトが互いの状態に依存することは、リアクティブ システムを扱う場合によくある問題だと思うので、洗練された解決策があることを願っています。
私は、この FRP のことは非常に難しく、しばしば混乱を招くと思うことを付け加えておきます。
haskell - Yampaとyampa-glutでキー入力を取得する
AFRPのトピック全体は非常にエキサイティングに聞こえます。私はその中で自分のプロジェクトを始めようとしています。Yampaとyampa-glutを見つけました。これは、GLUTへの優れたバインディングのようです(GLUTは、WindowsとLinuxの両方で実行される唯一のグラフィックライブラリです)。
yampa-glut
ソースには、私がそれを研究するためにコピーした簡単な例が付属しています。次に、それを拡張して、主要なイベントの簡単なテストを追加したいと思いました。その完全なソースはここにあります。23行目とキー機能を除いて、それほど新しいものはありません。
期待される結果は、キーを押したり離したりするたびにシェルに単純な出力が表示されることです。しかし、それは起こりません、出力はありません。
最後の前の行をこれに変更すると:
次に、いくつかのキー入力を取得しますが、すべてではなく、多くがスキップされます。
これについての説明が見つからなかったので、どこが間違っていたのか、キーボードとマウスボタンの入力を取得するために何ができるのかを誰かに説明してもらいたいと思います。
haskell - ヤンパの反応(センス)機能の時差
私は現在 Haskell と Yampa を学んでおり、反応機能について質問があります。
型シグネチャからわかるように、sense 関数の出力の一部は、関数の現在の呼び出しと前回の呼び出しの間の時間差です。私が見た例では、この時間差は意味の中で「手動で」計算され、IORef を使用して前の呼び出しの値を保持します。
外部状態を使用して時間差を追跡しなければならないのは奇妙に思えますが、なぜこの計算が反応関数で行われないのですか? IORef はそれを処理する良い方法ですか?
haskell - ヤンパパーティクルフィールド
ヤンパにパーティクルフィールドが欲しいです。単一の粒子は直線で移動する必要がありますが、指定された角度によって異なります。その角度と移動速度は、プレイヤーの速度と角度に応じて変化します。どう説明したらいいのかわからないので、このゲームに似たものを開発しています。
とにかく、今のところ私のコードは次のようになります:
vel
は現在の速度、a
は現在の角度です。しかし、粒子は奇妙な方法で移動します。(ここに完全なコード
残念ながら、私は間違った方法で考えていると確信していますが、それを行う方法、特にintegral
正しく使用する方法をまだ理解できていません。
多分誰かが私にいくつかのヒントを与えることができます。
haskell - やんぱバリュースイッチ
SF Input (Event ())
スペース キーのキーアップを表すイベントがあります。gravity
ユーザーがキーを離すたびに、 と の間で切り替える必要があり1
ます(-1)
。だから私はこれをしました:
しかし、それが行うことは、キーをもう一度押すまで、繰り返しで値を上下に切り替えることです。どこで間違ったのかわかりません。
完全なソースはここにあります。誰かが私を助けてくれるかもしれません。
haskell - 矢印の一次制約を回避するにはどうすればよいですか?
一次制約とは
最初に、矢印に対する 1 次制約の意味を説明します。矢印の desugar の方法により、矢印 do 表記で矢印コマンドが予期される場合、ローカルにバインドされた名前を使用することはできません。
以下に例を示します。
proc x -> f -< x + 1
desugar は to にarr (\x -> x + 1) >>> f
、同様proc x -> g x -< ()
に desugar toarr (\x -> ()) >>> g x
になります。ここで、2 番目x
は自由変数です。GHC ユーザーガイドはこれを説明し、矢印がモナドでもある場合、インスタンスを作成してこれを回避するためにArrowApply
使用できると述べていますapp
。のようなものが にproc x -> g x -<< ()
なりarr (\x -> (g x, ())) >>> app
ます。
私の質問
Yampa は、accumHold
このタイプの関数を定義します: a -> SF (Event (a -> a)) a
. 矢印のこの一次制限により、次の関数を書くのに苦労しています。
上記の定義n
は、脱糖後にスコープ外であるため機能しません。
または、同様に、ペアの最初の部分がにSF
渡される初期値であることを意味するこの関数accumHold
私が見逃しているコンビネーターやトリックはありますか? それとも、ArrowApply
インスタンスなしでこれらの定義を書くことはできませんか?
tl;dr: yampa でaccumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) a
orを定義することは可能ですか?accumHold' :: SF (a,Event (a -> a)) -> a
注:ArrowApply
forのインスタンスはありませんSF
。私の理解では、定義することも意味がありません。詳細については、「アローを使用したプログラミング」を参照してください。
haskell - Yampa でのスプリング/ダンパー システムのシミュレーション
Simulink で行うように、いくつかの基本的なシステム シミュレーションに Yampa を使用しようとしています。この場合、この simulink チュートリアルで導入されたスプリングとダンパー システムをシミュレートしたいと考えています。システムを表すために、次の信号関数を作成しました。
関数は基本的なフィードバック ループfeedback
を作成し、次のように実装されます。
ああ、そして:
賢明な正の定数を使用すると、非常に不安定なシステムが得られます。
フィードバック ループを構築したり、統合を適用したりする方法に明らかに問題がありますか?
haskell - 矢印化された FRP の連続信号スイッチング
私は Haskell (特に Yampa) で Arrowized FRP ライブラリをいじっていますが、「継続的な」切り替えを行う方法がよくわかりません。sf
つまり、信号は、それ自体が信号である信号関数 (以下) を通過することを意味します (画像の上半分に描かれているように)。
スイッチのパラメータがどうなるか前もってわからないので、これを単純なバイナリ スイッチに減らす方法がわかりません。
可能であれば、どのようにすればよいのでしょうか。私は Yampa コードの方が好きですが、Arrowized FRP コードであれば何でも構いません。これらの場合に同じ混乱が生じるかどうかを知るために、他のライブラリ(SodiumやReactive Bananaなど)を試したことはありませんが、それらについても興味があります.
編集
これをより明確にするために、画像にラベルを付けました。ラベルの可能なタイプは次のとおりです。
で:
Either Int (Int -> Int)
1 :
(Int -> Int) -> (Either Int (Int -> Int) -> (Int -> Int))
sf は次のようになります。
(Either Int (Int -> Int) -> (Int -> Int)) -> Either Int (Int -> Int) -> (Int -> Int)
(例: app
)。ただし、それは疑問符の付いた部分が への入力を表している場合のみですsf
。より複雑なスイッチを表す場合、タイプは次のようになります。
(Either Int (Int -> Int) -> (Int -> Int)) -> (Int -> Int)
代わりは。
- 2とoutはほとんど無関係です。
に適用される関数を表すラベルの付いた信号を使用し、それ自体がsへの引数と s 自体の両方のソースであることで、回路がであるか のように動作するようにするという考えです。入力を処理し、それらの入力に基づいてその動作 (それを構成する信号関数) を動的に変更できる回路を取得したいと考えています。sf
app
f
in
in
f
f
一方では、この場合には;がないsf
ので、実際には ではないように思えます。しかし一方で、何らかの洗練された切り替えで同じ動作を実現できると思います。app
ArrowApply