問題タブ [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 - テンプレート Haskell が生成した定義をエクスポートする
私のモジュールには定義が含まれており、その一部は(module
節で)エクスポートされます。Template Haskell で生成された宣言もエクスポートしたいと考えています。しかし、module
TH で句を変更する方法がないように見えるので、これを行うことはできません。
TH で生成された宣言をエクスポートするように指定することはできますか? または、これを行う他の方法がありますか?
haskell - Template Haskellの何がそんなに悪いのですか?
テンプレートHaskellは、Haskellコミュニティから不幸な便利さとして見られることが多いようです。この点に関して私が観察したことを正確に言葉で表すのは難しいですが、これらのいくつかの例を検討してください
- 「醜い(しかし必要)」の下にリストされているテンプレートHaskellは、ユーザーがどのHaskell(GHC)拡張機能を使用/回避すべきかという質問に答えています。
- テンプレートHaskellは、newtype'd valuesスレッド(ライブラリメーリングリスト)のUnboxedVectorsで一時的/劣ったソリューションを検討しました
- Yesodは、Template Haskellに過度に依存していると批判されることがよくあります(この感情に応えてブログ投稿を参照してください)
テンプレートHaskellを使って人々がかなりきちんとしたことをし、通常のHaskellでは単純に不可能なより美しい構文を可能にし、ボイラープレートを大幅に削減するさまざまなブログ投稿を見てきました。では、なぜテンプレートHaskellがこのように見下されているのでしょうか?何がそれを望ましくないのですか?テンプレートHaskellを避けるべき状況とその理由は何ですか?
haskell - 名前からデータ型を作成しますか?
重複の可能性:
テンプレート Haskell 宣言のローカル変数
「Foo」のような文字列を指定すると、の構文ツリーを構築する単純な Template Haskell 関数を構築しようとしていますdata Foo = Foo
。
今、私はのようなことをしようとしていますがmkDecl name = [d|data $(conT name) = Foo|]
、それは私にエラーを与えています:「型またはクラス宣言の不正なヘッド: $(conT name)」. 何が起こっているのか分かりますか?
dataD などを使用して書き出すこともできますが、何が起こっているのかがより明確になるため、この方法を好みます。
haskell - 関連付けられたタイプの同義語を使用したData.Vector.Unboxの自動派生
私はデータ型を持っています
ここで、「q」はクラスのインスタンスになります
'IntType'は、'q'に関連付けられた基底表現(つまり、Int、Integralなど)です。
ZqをData.Vector.Unboxのインスタンスにしたい。上記のリンクで提案されているように、現在、約50行の簡単なコードを使用してUnboxを手動で導出しています。コードでいくつかの異なるタイプの「Unbox」を作成するため、タイプごとに50行を書き込むのは魅力的ではありません。
ここで2つの選択肢を見つけました。1つの代替手段は、テンプレートHaskellを使用してUnboxのインスタンスを派生させるこのパッケージを使用することです。THコードは次のようになります。
問題は、関連付けられたタイプの同義語を使用してインスタンスを定義できないことです(またはできますか??)
[関連する質問:FlexibleInstancesによって暗示される拡張機能であるTypeSynonymInstancesが、関連付けられたタイプの同義語インスタンスを許可しないのはなぜですか?これはどういうわけか根本的に別の獣ですか?]
その問題に対する私の現在の解決策は、Zqを次のように再定義することです。
次に、等式制約を追加します
(Zq qi)を含むすべてのインスタンスで、これはあまりエレガントではありません。私の(作業中の)Unboxの派生は
タイプ「i」を明示的に公開することなく、これを達成できるはずだと思います。私が行ったのは、関連付けられた型の同義語から、等式制約のある明示的なパラメーターに移動することだけです。なぜこれが「基本的に」異なる(そして明らかに安全な)アプローチなのですか?タイプパラメータ「i」の追加を回避し、それでも自動Unbox派生を取得できる方法はありますか?
追加の型パラメーターは別として、THパッケージを使用して(Vector r)のUnboxを導出するのに問題があります。つまり、UnboxVectorのUnboxVectorを作成したいと思います。私の試みは次のようなものです。
しかし、私は次のような(たくさんの)エラーを受け取ります:
私のZqタイプで問題なく機能するのに、なぜこのメソッドが見つからないのかわかりません。
上記の2番目のアプローチは、拡張機能GeneralizedNewtypeDerivingを使用することです。このアプローチで私が目にする最大の問題は、Unboxにする必要のある実際のデータ(Newtypeではなく)があることです。ただし、拡張機能を使用するだけで、次のように記述できるはずです。
または少なくとも
最初はエラーにつながります:
そして2番目は与える:
上記の投稿から、派生できるはずだと私は信じているので、なぜこれらのインスタンスを派生できないのかわかりません。おそらく、GeneralizedNewtypeDerivingで関連付けられた型の同義語を使用することで逃げることができますか?(これでも(おそらく)データのUnboxを導出する必要がある場合、問題は解決しません。)
ご協力いただきありがとうございます!
scala - Scalaによるコード生成
ScalaでSBTツールチェーンを使用する場合、プロジェクトのソースの特別な部分を読み取ってコンパイル時にscalaコードを生成するタスクを作成することは可能ですか。
これに関するアイデアや記事/チュートリアルさえありますか?テンプレートHaskellにかなり似たものを探しています。
haskell - TemplateHaskell が GHC にパッケージをロードさせるのはなぜですか?
現在のモジュールの名前を出力する単純な Template Haskell プログラムがあります (ここではメイン)。
これをコンパイルすると、ghc から次の Loading メッセージが表示されます。
Template Haskell が有効になっているときに ghc がこれらのパッケージをすべてロードするのはなぜですか? Template Haskell を使用するプログラム、特に多くのパッケージに対してビルドされたプログラムをビルドするときはいつでも、これらの余分な「読み込み中」メッセージでコンパイル警告が圧倒されます。メッセージが印刷されないようにするか、(不要な?) モジュールのロードがまったく行われないようにできればいいのですが。
haskell - モジュールをレコードに具体化する
任意のモジュールがあるとします
、foo
、bar
およびbaz
が正しく実装されている場合など。
このモジュールを、自動生成されたデータ型と対応するオブジェクトに具体化したいと思います。
名前は元のモジュールと正確に同じでなければなりません。
これを手動で行うこともできますが、それは非常に面倒なので、このタスクを実行するためのコードを書きたいと思います。
そのようなタスクにアプローチする方法がよくわかりません。Template Haskell はモジュールを検査する方法を提供しますか? GHC api にフックする必要がありますか? それとも、ハドック ページをスクレイピングするなど、よりアドホックなアプローチでうまくいくでしょうか?
haskell - 1 つのコンストラクターがモナド計算を生成する AST の式 quasiquoter?
非常に単純化した意味で、次のようなものがあります。
さて、おもちゃの言語に疑似クォーターがあると便利だと判断するまで、テンプレート Haskell を使用したことは一度もありませんでした。
しかし、いずれにせよ、私はそれを少しいじり始め、いくつかのチュートリアルなどに従って、Fn
コンストラクターの扱い方以外は基本的にすべてが簡単であることがわかりました。
Web で情報を収集しているときに、人々が式 quoter を書く一般的な方法を 2 つ見つけました。
- データ型をTH
Expr
:s のインスタンスにしLift
、単純に [| quote |] 解析結果の式 Data
とTypeable
に相当するものを導出し、同じパーサー結果にExpr
適用するdataToExpQ
どちらの場合も、Runtime Expr
. 最初のケースの問題は、実装方法がわからなかったことです。
(ただし、Data.Text のインスタンスを自分で実装することはできました)。
本当の問題は、私がまだ TH を十分に理解していないことだと思いますが、これまでのところ、チュートリアルや例の量はどれも役に立ちませんでした。
2 番目のケースの問題は、Expr
が のインスタンスにData
なるには、
私の質問は、これを行う簡単な方法があるかどうかです。それとも、おもちゃの言語の機能がどのように機能するかを再考する必要があるのでしょうか?
後者の場合、モナド内で実行せずに同等の機能を取得する方法に関する推奨事項はありますか? 結局のところ、言語のランタイム環境には状態とエラーの処理が必要なため、これは直感的な解決策のように思えます (これは私が使用しているものEither
です)。
haskell - テンプレート Haskell タプル更新関数
次のような関数はありますか、または関数をどのように記述しますかupdateTuple
?
基本的に、 の最初の引数はupdateTuple
更新するタプルの長さで、2 番目の引数はそれらの要素のインデックスです。最初のタプルは更新関数、2 番目のタプルは古いタプルであり、これらの更新関数をそれぞれの要素に適用します。
Tuple-thを調べましたが、これを簡単に実装するために使用できるものは見つかりませんでした。
編集: $(updateTuple 5 [0, 2, 4])
もOKです。
haskell - テンプレート haskell を使用してスコープ内のすべての関数/値を取得する
テンプレート Haskell を使用して、スコープ内のすべての関数を一覧表示する方法はありますか? 何かのようなもの
私がこれでやろうとしているのは、test_ で始まるすべてのインポートされた関数のリストを取得し、テストを自動的に実行することです。