問題タブ [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.

0 投票する
2 に答える
1144 参照

haskell - purescript でアプリを構築する方法

関数型プログラミングと Purescript を試してみることにしました。コードを読ん"Learn you a Haskell for great good""PureScript by Example"少し遊んだ後、基本を理解していると言えると思いますが、コードが非常に結合しているように見えることが 1 つあります。ライブラリを頻繁に変更するのが普通で、OOP ではオニオン アーキテクチャを使用して、独自のコードをライブラリ固有のコードから切り離すことができますが、Purescript でこれを行う方法がわかりません。

私は人々が Haskell でこれをどのように行っているかを見つけようとしましたが、「Haskell で複雑なアプリケーションを作成したことがないので、誰もその方法を知りません」または「入力があり、出力がある」などの回答しか見つかりませんでした。 、その間にあるものはすべて純粋な関数です。」しかし、現時点では、仮想ドメイン、シグナル、Web ストレージ、ルーター ライブラリを使用するおもちゃのアプリがあり、それぞれに独自の効果とデータ構造があるため、1 つの入力と 1 つの出力のようには聞こえません。

私の質問は、アプリの半分を書き直さずにライブラリを変更できるように、コードをどのように構成するか、またはどのようなテクニックを使用する必要があるかです。

アップデート:

複数のレイヤーを使用し、エフェクトをメイン モジュールに保持するという提案も非常に一般的であり、そうする必要がある理由も理解しています。
これは、私が話している問題をうまく説明する簡単な例です。

ここには、ルーティング、Web ストレージ、dom 操作、およびコンソール ロギングを備えた単純なカウンター アプリがあります。ご覧のとおり、単一の入力と単一の出力はありません。ルーターまたはイベントリスナーから入力を取得し、コンソールまたは dom を出力として使用できるため、少し複雑になります。

この効果的なコードをすべてメイン モジュールに置くと、次の 2 つの理由から、私には違和感を覚えます。

  1. ルートとコントローラーを追加し続けると、このモジュールはすぐに数千行の混乱に変わります。
  2. ルーティング、dom 操作、およびデータ保存を同じモジュールに保持することは、単一責任の原則に違反します (FP でも重要であると思います)。

このモジュールをいくつかのモジュールに分割できます。たとえば、コントローラーごとに 1 つのモジュールを作成し、ある種の効果的なレイヤーを作成できます。しかし、10 個のコントローラー モジュールがあり、DOM 固有のライブラリを変更したい場合は、それらをすべて編集する必要があります。

このアプローチは両方とも理想からかけ離れているため、問題はどちらを選択するかです。それとも他に行く方法があるのでしょうか?

0 投票する
1 に答える
1184 参照

purescript - How can I write a purescript effect handler that subracts an effect from the set

PureScript by Example, in the section The Eff Monad -> Handlers and Actions states that "[an effect] handler usually subtracts effects from the set". However, the examples are rather opaque and I can't work out how to write my own handler to achieve this.

Specifically, I'm working with purescript-aff and purescript-affjax. I'd like to use runAff (from purescript-aff) in combination with get (from purescript-affjax).

The problem is that get uses the Affjax monad, whereas runAff expects something using the Aff monad.

Affjax is defined as:

Aff is defined as:

I, therefore, want to write a function that has the following type:

This seems to me to require a handler that subtracts the ajax part of the effect set. How would one code such a handler?

Attempting to pattern-match, as below, of course results in the error unexpected |.

Thanks all.

Update

Inspired by @christoph-hegemann's answer below, I was able to track down most of the issues with my code.

I think the answer to the question in the title is that one does not subtract an effect from the set, and that description is a little confusing. The effect remains after you've handled it.

The intuition I was missing is that I have to add the expected effects to the calling function type. The lack of a type declaration on main hid that to some extent. I worked it out when I turned Christoph's example into the following compiling example:

0 投票する
1 に答える
118 参照

typeclass - 型クラス、インスタンス、ラッパー

これ(バージョン 1)はコンパイルできるのに、下のバージョン(バージョン 2)はコンパイルできない理由を誰かが説明してくれませんか。

これはコンパイルされません

そして私にこのエラーを与える

では、バージョン 2 に似たバージョンを作成して、結果をラッパーに入れるにはどうすればよいでしょうか?

0 投票する
2 に答える
248 参照

functional-programming - 関数はいつ有効になりますか?

FFI を使用して一部の API (DOM API など) をラップする場合、機能が有効かどうかを判断するのに役立つ経験則はありますか?

次に例を示します。

効果があるのは正しい気がquerySelectorしますが、よくわかりませんgetTagName

アップデート:

純粋な関数とは何か、プログラムの状態を変更してはならないこと、DOM が悪い例であることを理解しています。

私がこの質問をするのは、既存の js ライブラリをラップするほとんどのライブラリでは、たとえ正しくないと感じても、ほぼすべての関数が効果的だからです。だから多分私の実際の質問は - この効果はこのラップされたjsライブラリの必要性を表していますか、それとも内部でステートフルな場合に備えてそこにありますか?

0 投票する
1 に答える
166 参照

functional-programming - エフェクトとファントムの種類

3 つのオブジェクトがあるとします。

FirstObj独自のプロパティとメソッドを使用して継承SecondObjおよびsomeProp拡張toggleSomePropします。状態プロパティ (および get/set メソッド) で拡張され、何でもかまいません。MainObjSecondObjMainObj

また、2 つのオブジェクトがFirstObjSrcありSecondObjSrc、どちらにもgetObjメソッドがあるとします。最初の 1 つは返さFirstObjれ、2 番目の 1 つは返されますSecondObj

それがPurescriptで実装されているのを見る方法です:

したがって、このコードについていくつか質問があります。

  1. この実装は正しいですか?
  2. ObjEff効果はファントムタイプが必要sですか?
  3. そうであれば(またはそうでない場合)、その理由を理解したいと思います(https://wiki.haskell.org/Phantom_typeと他のいくつかの説明を読みましたが、基本を理解していると思います。しかし、効果は私を少し混乱させます)。

アップデート

上記のコードは架空のブラウザー (または NodeJS) API の一種であり、何らかの形で変更する方法はないとしましょう。

0 投票する
1 に答える
925 参照

ffi - purescript の FFI を使用してコールバックで js 関数を呼び出す

purescript から javascript 関数を呼び出そうとしていますnavigator.geolocation.getCurrentPositionが、2 つの問題に遭遇しました。

JavaScriptでは、次のようなものを使用して呼び出されます

位置はオブジェクトです。

まず、何も返さず、代わりにコールバックを呼び出すため、戻り値の型がどうあるべきかわかりません。

第二に、結果が返されないため、関数を純粋にすることはできないため、コールバックに使用する型がわかりません。

これまでのところ、

したがって、ここで外部関数の型シグネチャは ですがforall eff a. Eff (geolookup :: GeoLookup | eff) {}、Eff の前にもコールバック パラメータが必要であることはわかっています。型シグネチャの書き方や実装方法がわかりません。