17

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

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

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

4

1 に答える 1

17

リンクしたページの少し下に:

TemplateHaskell —コンパイル時でも副作用を引き起こす可能性があり、抽象データ型へのアクセスに使用できるため、特に危険です。THでモジュールの境界を破るのは非常に簡単です。

副作用に関する懸念は、THを使用するとIO、コンパイル時にを使用して任意の計算を実行できるという事実に起因しますrunIO。これは、安全への希望を窓の外に投げ出すでしょう。

モジュールの境界を破ることは、THを使用すると、たとえば、モジュールがデータコンストラクターをエクスポートしなかった場合でも、データコンストラクターにアクセスできることを意味します。

モジュールの境界を破る例など、Safe Haskellで許可するのが安全ではない多くの例については、このリポジトリを参照してください。

これらの機能を無効にすると、Template Haskellを安全にすることができるかもしれませんが、THに大幅な変更を加える必要があります。

于 2011-08-18T13:04:16.180 に答える