問題タブ [scrap-your-boilerplate]
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.
f# - f# でボイラープレートを破棄する
私はHaskell プログラミング言語でScrap Your Boilerplateライブラリと Uniplate ライブラリを使用しましたが、判別共用体に対する汎用プログラミングの形式が非常に役立つことがわかりました。f# プログラミング言語に同等のライブラリはありますか?
generics - Data.Data -- アリティ 2 型コンストラクタの dataCast1 の生成 (部分的に特殊化)
したがって、Data.Map はdataCast2
定義されています。これは、アリティ 2 型のコンストラクターを持っているため、理にかなっています。dataCast1
デフォルトはconst Nothing
です。dataCast2
として簡単に定義されgcast2
ます。
参考のため:
Data.Data
当面の問題は、次のとおりです。 、Data.Typeable
などのすべてが与えられ、アリティ 2 型のコンストラクタdataCast2
が定義されている場合 (たとえば、Map
、または)、部分的な特殊化に対して正しいことを行う(,)
バージョンを作成することは可能ですか?dataCast1
一度に 1 つの特定のコンストラクターに対して、または一般的に、この型コンストラクターの
直観的には、良い解決策があるはずだと思いますが、最初の数回はクラッシュして燃えました。
haskell - SYB を使用して型を変換することは可能ですか?
myの名前 (階層識別子を表す) を、モナドの非表示状態として保持されるシンボル テーブルの名前 (整数)rename
に置き換える関数を書きたいと考えています。String
AST
GUID
Renamer
名前のAST a
型でパラメータ化された型があります。AST のリーフにある名前のタイプは次のName a
とおりです。
これにより、SYB トランスフォーマーでそれらを簡単にターゲットにすることができます。
パーサーは次のように入力されます (簡潔にするためにエラーの可能性は無視します)。
rename
関数を次のように入力します。
SYB を使用して、トランスフォーマーを使用してすべてName String
のを にName GUID
変換することは可能ですか?
からの他のすべての値は、子c String
をc GUID
変換し、同じコンストラクターを使用して貼り付けますが、型パラメーターは異なりますか?
everywhereM
関数は私が望むものに近いですが、変換はできますが、変換はできませc a -> m (c a)
んc a -> m (c b)
。
私のフォールバックソリューション(定型文を手で書く以外)は、型パラメータを から削除し、次のようAST
に定義するName
ことです:
名前の変更が入力されるように:
で動作させるeverywhereM
。ただし、これにより、名前が変更された後も an が 's をAST
保持している可能性が残ります。型システムを使用して、名前が変更されたものは名前しか保持できないStrName
という事実を正式に把握したかったのです。AST
GUID
haskell - Haskell の Data.Typeable とは?
Haskell のData.Typeable
.
どのような問題をどのように解決しますか?
generics - Haskell の "Scrap Your Boilerplate" (SYB) に相当する Clojure
私は Haskell でScrap Your Boilerplateという興味深いライブラリを見つけました。これはSimon Peyton Jonesの論文に基づいており、関数型プログラミング言語で大規模で深くネストされたデータ構造を更新できるコードを効率的に作成する方法のようです。次のようなコードを有効にします。
これにより、大規模で複雑になる可能性のある会社のデータ構造内のすべての人に対して、一定の割合 k で給与が効果的に増加します。
Clojure で同じ種類のプログラミング スタイルを実現する同等のライブラリまたはアプローチはありますか?
たとえば、上で使用した例に相当する Clojure をどのように記述すればよいでしょうか。
resharper - CQRS dev 用の Resharper 6 ライブ テンプレート
ddd-cqrs リストでは、Resharper ライブ テンプレートを使用して、CQRS 開発を行っているときに得られるボイラープレート コードを処理するのに役立つ人々について、いくつかのおしゃべりがありました。
これは定型的な狂気を克服するための最良の方法ですか?コミュニティと共有したい人はいますか?
haskell - Scrap Your Boilerplate のキャスト演算子の型を理解する
Laemmel と SPJ による2003 年のScrap Your Boilerplate ペーパーの 3 ページにコード スニペットがあります。
そして紙は説明します
つまり、mkT fx は、x の型が f の引数の型と同じ場合、f を x に適用します。
cast f
この論文の前の例のパターンに従って、の型を上記の型と比較してMaybe (b -> b)
に評価する必要があると思いますJust g
が、これは正しくないようです。
の署名でここで何が起こっているのcast f
ですか?
generics - Haskell クラスの一部ではないボイラープレートを避ける
人工生命実験のフレームワークを開発しています。各種が Agent クラスのインスタンスである限り、フレームワークは複数の種をサポートできます。各エージェントを AgentBox にラップして、基になる型を知らなくても読み書き、使用できるようにします。
これはうまく機能しますが、フレームワークのユーザーが作成しなければならない小さなボイラープレート関数が 1 つあります。これを回避する方法があるかどうか知りたいです。関数の型シグネチャで型変数が言及されていないため、Agent クラスでその関数の既定の実装を提供することはできません。私はボイラープレートで暮らすことができますが、もっと良い方法があるかどうか知りたいです.
これは、私が話していることの最小限の実例です。最後の getRock 関数は、ユーザーに強制的に記述させたくないものです。クラス Agent のすべてのインスタンスは、エージェントを読み取ってボックスにラップする関数を提供する必要があり、実装は常に getRock とまったく同じように見えます。
haskell - 三次型構築子(ext3)の型拡張のためのSYB関数を定義する方法は?
Scrap Your Boilerplateパッケージには、Data.Generics.Aliases
単項およびバイナリ型コンストラクターの型拡張を可能にする関数があります。特に、との定義がext1
ありext2
ます。
さて、ext1
とext2
は型クラスの一部である、、dataCast1
とで定義され、通常は機械によって定義されます。しかし、がないので、を定義する簡単な方法がわかりません。dataCast2
Data
DeriveDataTypeable
dataCast3
ext3
を定義することは可能ext3
ですか?もしそうなら、どのように定義しますか?
haskell - 現在のSYBは、新しいタイプのジェネリック関数の拡張を許可していますか?
最初の 2つのScrapYourBoilerplateペーパーでは、一般的なタイプで機能するが、特定のタイプでは特殊なケースがあるジェネリック関数を作成する方法について説明しています。たとえばfromJSON
、aeson
パッケージから、JSONから変換するためのジェネリック関数を定義しますが、listやInt
:などのタイプの特殊なケースを提供します。
ただし、3番目のSYBペーパーで指摘されているように、「ジェネリック関数定義の再帰的な結び目が結ばれている場合は、すべてのタイプ固有のケースを一度に提供する必要があります」。次に、この論文は、型クラスのメカニズムを通じてこの制限を解除する方法を提案しています。
最初の2つのSYBペーパーは(いくつかの変更を加えて)syb
パッケージの一部ですが、3番目はそうではありません。HackageでのSYBの実装で、すべてのタイプ固有のケースを一度に指定する必要があるという制限を解除する他の方法はありますか?