問題タブ [purescript]
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.
purescript - 「未定義の値です。参照は許可されていません」回避策
The value of xyz is undefined here, so reference is not allowed.
do 表記とともに、コンパイラ エラー メッセージに関する説明を探しています。例を十分に一般化することができませんでした。私が与えることができるのは、この動作に出くわした具体的な例だけです。そのために残念。
purescript-parsingを使用して、ネストされた複数行コメントを受け入れるパーサーを書きたいと思います。例を単純化するために、各コメントは で始まり、(
で終わり、または別のコメント)
を含むことができます。a
いくつかの例:(a)
そして((a))
受け入れられる、()
、(a
またはfoo
拒否される。
The value of comment is undefined here, so reference is not allowed.
次のコードでは、次の行でエラーが発生しcontent <- string "a" <|> comment
ます。
その上に行を挿入することでエラーを取り除くことができます。content <- string "a" <|> comment
私が理解している限り、結果のパーサーはまったく変更されません。
質問は次のとおりです。
- ここで何が起きてるの?余分な行が役立つのはなぜですか?
- コードをコンパイルするための非ハッキーな方法は何ですか?
purescript - 異種の(しかし共有クラスの)リストの代わりに適切な抽象化はありますか?
問題
PureScript でゲーム エンジンを作成しようとしています。私はそれに慣れていませんが、以前に実世界の Haskell を経験したことがあるので、習得はスムーズでした (ただし、Haskell を「実際の」ものに使用した経験はあまりありません)。可能な限り多くの実行時エラーをコンパイル時エラーに変換することは、私の本では勝利ですが、言語が問題を抽象化する私の能力を過度に制限していることが判明した場合、その勝利の一部を取り除くことができます。
さて、私は HTML5 Canvas/context2d を介して PureScript で 2D ゲーム エンジンを構築しようとしています (明らかに、purescript-canvas はこれに最適な選択です - Elm の Graphics.Canvas モジュールよりもはるかに好きです。実際の基礎となる JS API により近くなり、特にキャンバスの個々のピクセルにアクセスできるようになります)。
私の既存の (未完成だが使用可能な) JS エンジンのコア機能は、「スプライト」のリストを保持し (それらはすべて共通のクラスを共有することを除いて異種)、それらすべてをループしてメソッドを呼び出す.update(timeDelta)
こと.draw(context2d)
でした。
スプライトはすべて共通のインターフェースを共有していますが、内部で根本的に異なるデータをサポートする必要があります。x/y 座標があるかもしれません。別の (おそらく環境効果を表す) には、「完了率」またはその他のアニメーション状態がある場合があります。
問題は、FFIを悪用して非常に不純なコードに侵入することなく、必要なことを行う同等の抽象化(異種/共有クラスリストへの)を思いつくことができないということです。
ソリューション (およびその問題)
異種リスト (duh)
明らかに、異種リストと同等のことを行うことができる最善の抽象化は、異種リストです。
Haskell スタイル
Haskell (つまり、公式の仕様/レポートではなく、だまされた GHC) がまさに私が望むものを提供していることがわかりました。クラスの制約を維持しながら、型情報をボックス化して、リスト内のすべての項目に単一のポリモーフィック関数を適用できます。型安全性を壊すことなく。これは理想的ですが、残念ながら PureScript では現在、次のような型を表現することはできません。
PureScript スタイル (最先端)
PureScript の場合、purescript-existsパッケージがあります。これはおそらく、すぐ上の Haskell ソリューションと同等の機能を提供することを目的としており、型情報を非表示にするのではなく、削除して、元に戻すことができます。これにより、異種のリストを作成できますが、型の安全性が完全に失われます。
もっと言えば、私はそれを満足のいくように機能させることができないと思います[Exists f]
.forall a. (Draw a) => a
タイプ私は元に戻します。抽出する必要がある「実際の」種類のタイプを示す何らかの「タグ」を含めることもできますが、そのような種類の悪ふざけを引っ張っている場合は、プレーンな JS でコーディングすることもできます。私がしなければならないことがあります(リストについては、スプライトが含まれているとは限りません)。
すべての状態が 1 つの大量のデータ値に
個々のスプライトのすべての状態を 1 つの大規模な構造で表し、それを各スプライトの「更新」実装に渡すことにより、すべてのスプライトを同じタイプを持つものとして統合できます (まだクラス ポリモーフィズムを使用できませんが、突然変異を含めることができます)。タイプの一部として個々のスプライト値の関数を作成し、それを使用します)。これには明らかな理由があります。各スプライトには、他のスプライトのデータを変更/更新する自由があります。大規模なデータ構造は、表現する必要がある新しい種類のスプライトの状態ごとにグローバルに更新する必要があります。エンジンを使用するすべての人がエンジンを変更する必要があるため、ライブラリを作成できません。JSでも構いません。
分離均質型
または、各スプライトが個別の状態を持ち、すべてが同じ状態表現を持つこともできます。これにより、「お互いのパイに指が入る」というシナリオは回避できますが、すべてのスプライトのニーズに関する過剰な知識、不要なタイプ構造のビットの大量の無駄なデータで更新する必要がある均一な構造がまだあります。すべてのスプライトによって。非常に貧弱な抽象化。
JSON でさまざまなデータを表すか、何を持っているか
ええ。この方法は、基本的にJS データを使用し、PureScript のふりをしているだけです。PureScript のタイピングのすべての利点を捨てなければなりません。
抽象化なし
それらすべてをまったく無関係なタイプとして扱うことができました。これは、新しいスプライトを追加したい場合は、最も外側の関数を更新して を追加する必要があることを意味しdraw
ます。おそらく考えられるすべての解決策の中で最悪です。drawThisParticularSprite
update
私がおそらくすること
利用可能な抽象化の選択肢の評価が正しいと仮定すると、必要なことを行うにはFFIを何らかの方法で悪用する必要があることは明らかです。おそらく、次のような統一されたレコードタイプがあります
Data
たぶんExists f
ある種のような、型抜きされた厄介なものはどこにありますか?
か何か。draw
メソッドとメソッドはどちらも個々のupdate
レコードに固有であり、どちらも から抽出する真のタイプを「認識」していますData
。
それまでの間、PureScript の開発者たちに Haskell スタイルの実存的なものをサポートする可能性について尋ねて、型の安全性を壊すことなく適切で真の異種リストを取得できるようにしたいと思います。主なビットは、(以前にリンクされたHaskellの例の場合)、ShowBox
(非表示の)メンバーのインスタンス情報を保存する必要があるため、関数Show
の独自のオーバーライドから、使用する正しいインスタンスを知ることになると思いますshow
.
嘆願
PureScript で現在利用可能なオプションに関して、上記が正確かどうか誰か確認してもらえますか? 特に、この問題に対処するためのより良い方法を見つけた場合、特に抽象化を犠牲にすることなく「純粋な」コードのみを使用できるようにする方法がある場合は、お知らせください。
javascript - PureScript と Pulp を使用してサーバーからバイナリ ファイルをダウンロードする正しい方法
XMLHttpRequest を作成し、それを実行して(可能な限り単純にするために同期的に)、結果である配列を返す単純なJavaScript関数があります。
そのスクリプトは js ファイル x.js にあり、それに対応する PureScript ファイル x.purs があります。
それに関してはすべて問題ありませんが、私はブラウザ オブジェクトである XMLHttpRequest を使用しており、pulp run を実行しようとすると、XMLHttpRequest が定義されていないというエラーが表示されます。
上記のオブジェクトを含むxmlhttprequestというnpmパッケージをインストールしようとしましたが、同様のbowerパッケージも試しましたが、両方とも失敗しました。
私はjavascriptに比較的慣れていないので、間違ったことをしようとしている方法は完全に間違っていると思います。これにアプローチする正しい方法は何ですか?
スクリプトを .html ファイル内に配置することでこれを修正できると思いますが、これを正しく行いたい、つまり、.purs ファイルと .js ファイルを一致させ、pulp に仕事をさせたいと考えています。
これを行うにはどうすればよいですか?
ありがとう!
purescript - 半群の「整数乗算」の定義
半群が与えられた場合、「何かを n 回実行する」という概念を形式化する「整数乗算」を定義したいと思います。
intMul n s == s <> s <> ... <> s
任意のおよびs
に対して、右側にが n 回出現します。Int
n
Semigroup
s
これはかなり一般的な概念のように思えるので、これには代数/群論的構造が既にあると思います。存在する場合、この構造の名前は何ですか? また、標準の purescript ライブラリの 1 つによって提供されますか?
そして、これを自分で書く必要がある場合: これの実装は各セミグループで同じです。これは、型クラスがこれを表現するための正しい選択ではないということですか?
編集:「intmultiplying」をゼロで適切に定義するには、半群ではなくモノイドが必要だと思いますintMul 0 s == mempty
。そして、負の Int による乗算を許可したい場合は、実際には逆要素、つまりグループが必要になります。純粋なスクリプトで型クラスを持っていないように見えるのはどれですか?
javascript - タイプを保持しながらタイプ付きオブジェクトのプロパティを設定する方法は?
私には特定のケースがありますが、一般的にも興味があります。
キャンバスがあり、createImageData を使用して ImgData を取得し、データ プロパティを別のものに設定して、PutImageData を使用し、この変更された ImgData を渡します。
コンソールで Javascript でロジックを記述しても問題なく動作しますが、私の PureScript バージョンは失敗します。エラーは次のとおりです。
PureScript では:
この JavaScript をコンソールに書き込むと動作します (arr は 160*144*4 ゼロです)
getCleanBuffer をデバッグしましたが、これが私が見つけたものです
この $9 (変更されたデータを含む ImgData のコピー) 変数を調べると、v (元の ImgData) のように ImgData 型ではないことがわかりますが、それは単なる「オブジェクト」です。v の幅と高さがありませんが、デバッグ中に修正しても同じエラーが発生します。
問題は、新しいオブジェクトが型のないレコードであることだと思います。幅と高さがコピーされていないという事実は、別の問題です。
データ属性を手動で設定する JavaScript 関数を記述できます。しかし、このケースは一般的によくあるケースのように思えますが、確かに何かが欠けているのではないでしょうか?
ありがとう!
purescript - Purescript テルミットとウェブソケット
websocket を使用してアプリケーションを構築するために purescript-thermite を使用しようとしています。アイデアは、アプリケーションが websocket を使用して何らかのサーバーに接続し、HTML ページをライブ更新するというものです。ただし、それをテルミット ワークフローに接続する方法が見つかりません。
とspec
で構成される がrender
ありperformAction
ます。は関数render
にアクセスできdispatch
ます。ただし、要素をレンダリングする前に websockets を開始する必要があります (おそらく に入れることができmain
ます) が、メッセージが到着したら、理想的にdispatch
は外部からコンポーネントにイベントを送信する必要があります。それを行う最善の方法は何ですか?
exception-handling - EXCEPTION 効果を持つ PureScript 関数から値を返すにはどうすればよいですか?
PureScript の効果について学び始めたばかりで、EXCEPTION 効果を持つ関数を作ろうとして行き詰っています。
これを実行しようとすると、次のエラーが表示されます
タイプが一致しませんでした
例外でない場合、 lengthGt5 は Eff にラップされた String を返す必要があることは理解していますが、 value の周りに「空のエフェクト ラッパー」を作成する方法がわかりませんa
。私はこれについて正しく考えていますか?