問題タブ [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.
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 つの理由から、私には違和感を覚えます。
- ルートとコントローラーを追加し続けると、このモジュールはすぐに数千行の混乱に変わります。
- ルーティング、dom 操作、およびデータ保存を同じモジュールに保持することは、単一責任の原則に違反します (FP でも重要であると思います)。
このモジュールをいくつかのモジュールに分割できます。たとえば、コントローラーごとに 1 つのモジュールを作成し、ある種の効果的なレイヤーを作成できます。しかし、10 個のコントローラー モジュールがあり、DOM 固有のライブラリを変更したい場合は、それらをすべて編集する必要があります。
このアプローチは両方とも理想からかけ離れているため、問題はどちらを選択するかです。それとも他に行く方法があるのでしょうか?
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:
typeclass - 型クラス、インスタンス、ラッパー
これ(バージョン 1)はコンパイルできるのに、下のバージョン(バージョン 2)はコンパイルできない理由を誰かが説明してくれませんか。
これはコンパイルされません
そして私にこのエラーを与える
では、バージョン 2 に似たバージョンを作成して、結果をラッパーに入れるにはどうすればよいでしょうか?
functional-programming - 関数はいつ有効になりますか?
FFI を使用して一部の API (DOM API など) をラップする場合、機能が有効かどうかを判断するのに役立つ経験則はありますか?
次に例を示します。
効果があるのは正しい気がquerySelector
しますが、よくわかりませんgetTagName
アップデート:
純粋な関数とは何か、プログラムの状態を変更してはならないこと、DOM が悪い例であることを理解しています。
私がこの質問をするのは、既存の js ライブラリをラップするほとんどのライブラリでは、たとえ正しくないと感じても、ほぼすべての関数が効果的だからです。だから多分私の実際の質問は - この効果はこのラップされたjsライブラリの必要性を表していますか、それとも内部でステートフルな場合に備えてそこにありますか?
functional-programming - エフェクトとファントムの種類
3 つのオブジェクトがあるとします。
FirstObj
独自のプロパティとメソッドを使用して継承SecondObj
およびsomeProp
拡張toggleSomeProp
します。状態プロパティ (および get/set メソッド) で拡張され、何でもかまいません。MainObj
SecondObj
MainObj
また、2 つのオブジェクトがFirstObjSrc
ありSecondObjSrc
、どちらにもgetObj
メソッドがあるとします。最初の 1 つは返さFirstObj
れ、2 番目の 1 つは返されますSecondObj
。
それがPurescriptで実装されているのを見る方法です:
したがって、このコードについていくつか質問があります。
- この実装は正しいですか?
ObjEff
効果はファントムタイプが必要s
ですか?- そうであれば(またはそうでない場合)、その理由を理解したいと思います(https://wiki.haskell.org/Phantom_typeと他のいくつかの説明を読みましたが、基本を理解していると思います。しかし、効果は私を少し混乱させます)。
アップデート
上記のコードは架空のブラウザー (または NodeJS) API の一種であり、何らかの形で変更する方法はないとしましょう。
ffi - purescript の FFI を使用してコールバックで js 関数を呼び出す
purescript から javascript 関数を呼び出そうとしていますnavigator.geolocation.getCurrentPosition
が、2 つの問題に遭遇しました。
JavaScriptでは、次のようなものを使用して呼び出されます
位置はオブジェクトです。
まず、何も返さず、代わりにコールバックを呼び出すため、戻り値の型がどうあるべきかわかりません。
第二に、結果が返されないため、関数を純粋にすることはできないため、コールバックに使用する型がわかりません。
これまでのところ、
したがって、ここで外部関数の型シグネチャは ですがforall eff a. Eff (geolookup :: GeoLookup | eff) {}
、Eff の前にもコールバック パラメータが必要であることはわかっています。型シグネチャの書き方や実装方法がわかりません。