問題タブ [template-haskell]
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 - Template Haskell のステージ制限に関する問題
Template Haskell の学習を始めたばかりで、スプライシングに関する単純な問題に固執しています。あるモジュールでは、タプルの N 番目の要素を返す
関数を実装しました。tupleN
メインモジュールには次のものがあります。
これは機能しているように見えますが、そうではありません。コンパイラはエラーを出力します:
タプルの説明を結合された式に入れると、コードが機能するようになります。
最初のバリアントで欠けているものは何ですか?
haskell - テンプレートHaskellと暗黙のパラメータ
テンプレートhaskellを使用して、暗黙的なパラメーターを使用して関数を作成したり、暗黙的なパラメーターを使用してバインディングを許可したりする方法はありますか?
つまり、テンプレートhaskellを使用して次のような署名を生成することは可能ですか?
または、次のような呼び出し:
テンプレートhaskellのAPIドキュメントで、このトピックについて役立つ適切な代数的データ型や関数を見つけることができませんでした。GHC7.4.2を使用しています。
テンプレートhaskellにこの拡張機能のネイティブサポートがない場合、コンパイル中にコードを挿入する他の可能性はありますか(テンプレートhaskell内の一般的な「コードインジェクション関数」のようなものですか?)。
編集:私はコメントからの提案を試しました、これは何が起こるかです:
これは機能しますが:
サポートされていないようです。
haskell - テンプレートHaskell引用でのスタンドアロン派生宣言
テンプレートHaskellがスタンドアロンの派生宣言を引用で無視するのはなぜですか?
c - 実行時に TemplateHaskell で生成されたコードを生成して実行することは可能ですか?
実行時に TemplateHaskell で生成されたコードを生成して実行することは可能ですか?
C を使用すると、実行時に次のことができます。
- 関数のソースコードを作成し、
- gcc を呼び出して .so (Linux) にコンパイルします (または llvm などを使用します)。
- .so をロードし、
- 関数を呼び出します。
Template Haskell でも同様のことが可能ですか?
compilation - このGADTテンプレートのHaskellモジュールでGHCが終了しないのはなぜですか?
テンプレート Haskell を使用した GADT の生成に問題があります。問題は、コードを完全にコンパイルできないことです。ファイルのロード時に GHCI が終了せず、ghc プロセスが大量のメモリと CPU を使用します (2.4GB、50~70%)。
私はそれがまだ起こる最小限の例を作ろうとしました。[| |]
オックスフォード表記 ( ) を使用するか、TH データ型を手動で適用して関数を作成するかは問題ではありません。次の単純なモジュールを検討してください。
Haskell Platform for x64 の OSX Mountain Lion で GHC 7.4.2 を使用しています。
なぜこれが起こるのか誰にも分かりますか?多分私はいくつかのコードを間違って使用していますか?
haskell - Haskell quasiquoter での任意の式のスプライシング
Why It's Nice to be Quoted を読んで、セクション 3 に準引用符で変数識別子をスプライシングする例があります。
subst
への再帰呼び出しが の外で行われる理由がわかりました。これは、セクション 3.2[:lam| ... |]
の関数が変数名から を構築するためです。antiVarE
TH.varE
私の質問は、変数名だけでなく、任意の式のスプライスをサポートするためにどれだけの作業が必要になるかということです?
例えば:
haskell - 関数名を出力する関数
Haskellで独自の関数名を返す関数を実装することは可能ですか?
可能なタイプは(a -> b) -> String
.
haskell - シングルトンデータ型を含むこの Template Haskell コードを書く良い(r)方法はありますか?
私は Template Haskell を使い始めたばかりで (ようやくユースケースを手に入れました!)、今は認知的に立ち往生しています。
私がやろうとしているのは、フォームのシングルトンデータ型宣言を生成することです
名前からV
始めます (できれば大文字で始めてください!)。明確にするために、私はdeclareSingleton
スプライスString -> DecsQ
が
と同等です
次のコードが機能し、必要なことを実行していますが、あまり満足していません。
次のようなものが機能することを望んでいました。
$s
、$v
、$(conT v)
、v
のさまざまな組み合わせを試してみましたが、役に立ちませんでした (ただし、すべてを網羅しているわけではありません!) 'v
。
ここで明らかな何かが欠けていますか? 本質的な方法で型名とコンストラクター名を混同してdeclareSingleton
いませんか?
もしそうなら、どのように; そうでない場合、なぜですか?
(余談: Template Haskell API は急速に変化します。私はそれを喜んでいます。この単純な型に、関連付けられた型ファミリを持つマルチパラメーター型クラスを最終的に実装してもらいたいのですが、API が現在経験している変化はそうではありません。チュートリアルを簡単に検索できます! 6.12.1 または 7.2 での TH の実装方法 (既存のチュートリアルのほとんどが作成されたとき) と、現在の動作方法には大きな違いがあります...)
haskell - 代数データ型の TH Lift インスタンスの定義
次のような複数のコンストラクターを持つ代数データ型があるとします。
Lift
インスタンスを効果的に作成するにはどうすればよいですか? これを行う最も簡単な方法は次のとおりです。
ただし、これは非常に冗長です。もちろん、さまざまな動物を のように直接抽象化することはできませんがlift x = [| x |]
、概念的には達成したいことと似ています。データ コンストラクターごとに同じ行を再度書き込む必要がないように、TH でこれを行う方法はありますか?
haskell - 引用のためのテンプレート Haskell 関数はありますか?
私は Template Haskell で遊んでいます。レコードのデフォルトの初期化子を作成できる準クォーターを作成したい、つまり次のようなもの
関数を作成する必要があります
基本的にはデータ宣言と同じ構文で、デフォルト値で拡張されています。現在record
はカスタムの QuasiQuoter ですが、内部には自分自身を解析したくない式と型があります。理想的には、中括弧内のブロックをステートメントに分割し、 and を探すだけで済み=
ます::
。
[e| ...|]
そこで、 orで引用するのと同じことを効果的に行う関数を探してい[t| ...|]
ます。Hoogle で関数を検索しましたが、何String -> ExpQ
もString -> Q Exp
見つかりませんでした。
私が何を探しているのかよくわからなかった場合:私は QuasiQuoters について知っています。私が述べたように:record
はQuasiQuoter です。準クォーターに渡される文字列には、式 ( などNode 7 (Node 8 Nil Nil) Nil
) とタイプ (True
またはなど) が含まれていMaybe (Either A B)
ます。私はこれらを自分で解析できますが、文字列を のような引用符に渡したのと同じように、それを実行する関数があることを願っています[e|...|]
。
だから:式を文字列として、またはタイプを文字列としてフィードでき、適切なExp
またはType
オブジェクトを返す関数を探しています。コンテキストに基づいて式または型を評価する必要があるため(引用と同じように)、Qモナドに存在する必要があると思います。