問題タブ [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.
string - Haskellで文字列を型コンストラクターに変換する
Haskellに次のような関数があるかどうか誰かが知っていますか?
すなわち。型コンストラクター名の文字列表現を受け取り、式とパターンの両方で実際の型コンストラクターに変換します。
編集:私の全体的な目標は、次のようなものを単純化することです。
単一のパターンマッチに変換するため、基本的にAddまたはSubを文字列に変換し、先頭に「I」を追加してから、タイプに変換し直します。
haskell - テンプレートHaskellを使用して、同じタイプを複数の場所にスプライスするにはどうすればよいですか?
OpenGLタイプのベクトル空間からクラスのインスタンスを定義しています。タイピングの筋肉を節約するために、TemplateHaskellを使用して一連のインスタンスを作成したいと思います。
AdditiveGroup
私は、次のインスタンスを派生させる関数を定義することから始めました。
$t
これは問題なく機能しますが、オックスフォードブラケットに1回だけ接続していることに注意してください。VectorSpace
ここで、インスタンスを派生させる関数は次のとおりです。
しかし、このバーフ:
t_ts
との違いはt_tt
、THがスプライスするたびに新しい一意の名前を作成していることを示しています$t
。もちろん、これらのタイプが同じ場合にのみ定義が機能します。
オックスフォードブラケットで必要な動作を実現する方法はありますか、それとも古き良きレキシカルスコープとLanguage.Haskell.TH
コンビネータにフォールバックする必要がありますか?これはおそらくCPPの方が簡単だと思いますが、この機会にTHを学びたいと思います。
haskell - Haskellレコードのフィールド名を文字列のリストとして取得しますか?
私が次を持っているとしましょう:
テンプレートHaskellを理解しており、reify
関数でレコードのフィールド名を取得できます。あれは:
テンプレートHaskellなしでこれを行うことができるという主張もあります。誰かがこれを達成できるための実装例を提供できますか?
haskell - レコードフィールド名を変数として持つテンプレートHaskell?
モナドを実装する次のコードがあります。後で、より複雑なロジックでフィールドの設定を簡素化するためにそれを使用しようとしています。
私は次のようなコードを使用します:
このコードは機能しますが、changeAlpha関数を単純化するためにTemplateHaskellを使用したいと思います。このようなものがあれば素晴らしいでしょう:
今、私はこれまで行ってきました:
しかし、私がこれに変更するとすぐに:
私はこれを手に入れます:
バリエーションはありません。これは可能ですか?
haskell - Template Haskell によって生成されたコードを表示するための推奨される方法
ご存知のように、Template Haskell は、コンパイル時にさまざまな種類の AST スプライスをプログラムで生成するために使用されます。
ただし、スプライスは非常に不透明な場合が多く、スプライスが実際に生成するものを識別するのが難しい場合がよくあります。スプライスのモナドを実行しQ
、スプライスが適切に型付けされている場合show
、生成された AST の部分を適切に表現できますが、構造化されていないレイアウトのため、この表現は非常に理解しにくい場合があります。
TH で生成された AST の一部を通常の Haskell コードに似たものに変換して、コードを簡単に読み取って理解できるようにするための推奨される方法は何ですか? たとえば、与えられた値からソースコードを再構築できDec
ますか? GHC Core コードを読む必要はありますか? 少なくとも AST を構造化して読みやすくする方法はありますか (たとえば、pretty-show
パッケージが行うことを超えて)。
haskell - レコードのフィールド名とタイプを内省するHaskell
最近の交換に基づいて、コンパイル時の型の安全性を確保するために、テンプレートHaskellを使用してコードを生成することを確信しました。
レコードフィールドの名前とタイプを調べる必要があります。を使用してフィールド名を取得できることを理解していconstrFields . toConstr :: Data a => a -> [String]
ます。しかし、私はフィールド名以上のものが必要です、私はそれらのタイプを知る必要があります。たとえば、タイプがのフィールドの名前を知る必要がありますBool
。
レコード、フィールド名、フィールドタイプf :: a -> [(String, xx)]
である関数を作成するにはどうすればよいですか?a
String
xx
haskell - Show を派生させるテンプレート Haskell データ宣言
以下はコンパイルされません。
エラーの意味がまったくわかりません:
このような派生を行うことは可能ですか?
haskell - Haskell:型がクラスのインスタンスであるかどうかを見分ける方法は?
次のようなテンプレートHaskell関数を作成したいと思います。
がのインスタンスであるTrue
場合は、のいずれかになり、それ以外の場合は結果になります。SomeType
Read
False
の結果を見てみたところreify
、コンストラクターの内容を探していると思いますClassI
が、ドキュメンテーションがやや不足していて、必要なものを解読するのに苦労しています。上記の関数を作成するために必要なデータを見つけるためにどこを探すべきかについて誰かがガイダンスを提供できますか?
haskell - Haskellにはメンバーを記録するためのポインター/参照がありますか?
、、、および次のような構文を使用して::*
、C++の構造体メンバーへの相対ポインターを作成および参照できます。.*
->*
Haskellでは、次のようなレコードゲッター用の一時的なラベルを簡単に作成できます。
Afaik、しかし、これらのゲッターを次のようなラベルとして使用してレコードを更新することはできません。
各レコードセッターをコーディングせずにこれを行う簡単な方法はありますか?
haskell - TemplateHaskellを使用したコンパイル時の関数の評価
私は単純なHashStringクラスを書いています。これは単なる文字列とそのハッシュです。
今、私はコンパイル時にこれらを次のようなもので生成しようとしています:
ハッシュとテキストパッキングをコンパイル時に実行する必要があります。どうすればよいですか?
これまで私が試したことは次のとおりですが、それが正しいかどうかはわかりません。また、コンパイル時にすべてが実行されるかどうかもわかりません。