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

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

haskell - SafeHaskellがTemplateHaskellをサポートしないのはなぜですか?

SafeHaskellのドキュメントには次のように記載されています。

[...]残念ながら、Template Haskellはモジュールの境界を覆すために使用できるため、このコンストラクターにアクセスするために使用できます。[...] Dangerモジュールをコンパイルするために-XSafeフラグを使用すると、安全なサブセットに使用できるHaskellの機能が制限されます。これには、unsafePerfromIO、Template Haskell、[...]の禁止が含まれます。

ASTを別のASTに変換するマクロシステムとして使用されますが、THをHaskellの安全なサブセットに単純に制限し、結果のASTをこのサブセットに制限することはできませんか?

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

haskell - 複数の型クラス インスタンス間の対称性を利用してコードを短縮する

環境

SI プレフィックスを表す Haskell モジュールを作成しています。

各 SI プレフィックスには、対応するデータ型があります。

問題

2 つの SI プレフィックスを適用すると、2 つのプレフィックスのどちらが小さいかを静的に判断する関数を書きたいと思います。例えば:

初期解

型クラスと機能依存関係を一緒に使用するソリューションを次に示します。

上記の解決策は問題を正しく解決しているように見えますが、欠点があります。型クラスのインスタンスの数は、型の数に対して2 次です。

質問

おそらく対称性を利用して、型クラスインスタンスの数を型の数に対して線形に減らす方法はありますか?

ここでは Template Haskell を使用する方が適切かもしれません。その場合は、解決策として遠慮なく提案してください。

ありがとう!

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

haskell - $(...)と[|を取り除く方法 ... |] Template Haskell関数を使用するときの構文?

テンプレートHaskellを学ぼうとしています。isLeft演習として、 and (この質問isRightに触発された)のようなものを生成できる関数を作成しました。これが私の謙虚な試みです:

$(isA [| Left |])問題は、より直感的なものではなく、書く必要があるということisA Leftです。醜い構文を取り除くことは可能ですか?ドキュメントに答えが見つからないようです。

この関数は1つの引数のコンストラクターでのみ機能しますが、これは別の質問です。

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

haskell - Template Haskellで引用されたデータコンストラクタ名を調べる方法は?

Template Haskell を学ぼうとしています。isLeft演習として、 andのようなものを生成できる関数を作成しました (この質問isRightに触発されました)。これが私の謙虚な試みです:

問題は、引数が 1 つのコンストラクターでのみ機能することです。犯人はconP nam [wildP]パターンです。理想的にconP nam (replicate (numArgs nam) wildP)numArgs、 はコンストラクタの引数の数を返す関数です。しかし、そのような関数をどのように書くのでしょうか? 関連するデータ宣言にアクセスする必要があると思いますが、その方法がわかりません。

これとまったく同じ機能について、別の質問がここにあります。

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

haskell - 同じ署名内の複数のモジュールで定義された関数を動的に呼び出す方法

多くの関数 (たとえば、100 以上) を定義しました。それぞれが特定の作業を行いますが、同じシグネチャを使用します。それは次のようなものです:

私がしたいのは、次のように、実際の「実行」をユーザー入力として提供することです。

現在、修飾されたすべてのモジュールをインポートし、すべてrunの を のリストに入れる[Maybe (IO())]ため、これは機能します。

しかし、n成長するにつれて、大きなリストを継続的に維持する必要があります。

TemplateHaskell を使用して大きなリストを定義する方法はありますか、または実行時に必要に応じて対応するモジュールをロードするだけで、各モジュールを異なる共有ライブラリに分離する必要はありません。


epsilonhalbeの回答に基づいて、いくつかの調査を行いました。

このコード ブロックは、run1との結果に続いて 2 を出力しrun2ます。最後の 2 行を削除すると、0 が出力されます。インポートされたが参照されていない関数は抽出されないようです...

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

haskell - テンプレートHaskellタイプの引用の問題

TemplateHaskellの引用符''は、タイプの名前を取得する方法として2つの引用符()を文書化します。

これは、このタイプ(名前)では正常に機能します。しかし、私はそれをうまく機能させる方法を見つけることができませんMaybe String

を使用して回避できることはわかっています[t| Maybe String |]が、これはQモナドにあり、タイプの変更が必要です。また、スプライスされた場合にのみ、それぞれの時点でタイプチェックされないと思います。

type MaybeString = Maybe String最初に型エイリアスを定義し、次にを使用して回避することもできます''MaybeStringが、これも面倒です。

''見積もりから直接欲しいものを手に入れる方法はありますか?

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

haskell - テンプレートhaskellのデータコンストラクター

リングZ/nを作成しようとしています(通常の算術のようですが、整数を法として)。インスタンスの例はZ4です。

リングについても同様です。私はこれらのものを素早く生成できるようにしたいと思っています、そしてそれを行う方法はテンプレートhaskellを使うことだと思います。理想的には、上記で定義したように$(makeZ 4)、コードを吐き出してもらいたいと思います。Z4

しかし、私はこれに多くの問題を抱えています。するとgenData n = [d| data $n = $n Integer]、「データ/ニュータイプ宣言の解析エラー」が発生します。ただし、変数を使用しない場合は機能し[d| data Z5 = Z5 Integer |]ます。これは、変数で何か奇妙なことをしていることを意味しているに違いありません。でもわかりません。newNameを介してそれらを構築しようとしましたが、それも機能しなかったようです。

誰かがここで何が起こっているのか私を助けることができますか?

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

haskell - テンプレートHaskell宣言の引用で余分なインデントを回避するにはどうすればよいですか?

私はおもちゃのプログラムを持っています:

テンプレートHaskellを追加しましょう:

それでは、インデントを修正しましょう。

スペースは1つで十分ですが、両方の末尾の行をインデントする必要があります。

モジュールのほとんどをインデントする必要を回避できますか?(私の実際のモジュールには、1行以上のコードがあります。)(そして、{ ; ; }表記法を使用せずに?)

すべてのモジュール宣言を引用符で囲みたいのですが、通常のコード(...)では、に置き換えることができますが、閉じ括弧とインデントを回避できる$ ...同等のものはありますか?[d|...|]

または、モジュールAが、AがインポートされたモジュールBの最上位の宣言が、関数Aがエクスポートすることによって自動的に処理されると言うことができる方法はありますか?

ノート:

  1. 私のRealProgramのテンプレートHaskellは、より複雑ですid—宣言をスキャンして開始する変数名をprop_探し、それらを含むテストスイートを構築します。ソースファイルを直接変更せずに、代わりにこれを行うことができる他の純粋なHaskellの方法はありますか?
  2. GHCv6.12.1を使用しています。GHC v7.0.3を使用すると、b.hsのエラーが別の場所で報告されます— b.hs:3:1—ただし、それ以外の動作は同じです。
0 投票する
2 に答える
1029 参照

haskell - Haskellの多項式因数分解

hammarの助けを借りて、コンパイルするHaskellビットのテンプレートを作成しました

私は今、この方法では解決できないと思う問題に直面しています。

多項式についての注目すべき事実は、それらがいくつかの素数を法として既約である場合、それらは有理数で既約であるということですp。私はすでに、ブルートフォースが与えられた(有限)体上で多項式を因数分解しようとする方法を持っています。

この関数を複数のフィールドで実行してみたいと思います。これが私が欲しいものの一種です:

基本的に、「除算」の多数の定義に対して素因数分解アルゴリズムを実行してみたいと思います。

これはTHでも可能だと思いますが、永遠にかかるようです。算術演算をパラメータとして渡す方が簡単かどうか疑問に思っていますisIrreducibleか?

あるいは、これはNewtypeモジュールが役立つ可能性があるように思われますが、同じように難しい方法でTHを使用しないとどのように機能するかを考えることはできません...

誰かがこれを達成するための最善の方法について何か考えがありますか?