8

特定のプラットフォームで Haskell 型に同等の強制可能インスタンスがあるかどうかを判断するにはどうすればよいですか?

CoercibleGHC 7.8について聞いたところですが、これは素晴らしいようです。その文脈では、私の特定の問題を解決するための同様に良い質問は次のとおりだと思います:どのペアの型について GHC に問い合わせる方法はありaますbCoercible a b? (現在のプラットフォームでは、たとえば)

コンパイラやプラットフォームにとらわれないプログラムで forを有効にするには、特定のプラットフォームに特定のインスタンスが存在するcoerce :: Coercible a b => a -> bかどうかを、できればコンパイル時だけで、場合によってはコードを書くときにも明示的に知る必要があるように思えます。Coercible a bそれ以外の場合は、より遅い非ヌープフォールバックを使用します(CPPを使用すると思います)。

フォローアップの質問: GHC が関数を提供することは理にかなっていますか?

coerceOrConvert :: (a -> b) -> a -> b

であるプロパティcoerceOrConvert f

  • coerceCoercible a b現在の GHC バージョンとプラットフォームのインスタンスがある場合

  • fそうでない場合

これは通常の型クラスにはあまり意味がないことはわかっていますが、Coercible通常とはかけ離れているように見えるので、私にはわかりません…</p>

4

1 に答える 1

5

通常、Haskell で処理される型変換には 2 つの種類があります。表現の等価性 (newtypeと を使用Coercible) と、型変数に関する新しい情報 ( を使用Typeable) です。2 番目のタイプは実行時の表現とはほとんど関係がないため、Coercible/newtypeメカニズムについてのみ説明します。

基になる表現ではなく型情報のみを変更することが保証されているnewtypeため、(標準的な例)

newtype Age = Age { unAge :: Int }

次に、次のようなことを確信できるはずです

instance Num Age where
  Age a + Age b = Age (a + b)
  ...

つまり、舞台裏で行われているポインターの間接化はありませ(+)ん。Int実際、GHC はAgeここで問題なくコンストラクターを削除します。課題は、次のようなことをしたいときに起こります

map Age :: [Int] -> [Age]

Intとは構造的に同一であるためAge、これもノーオペレーションである必要があります---コンパイル時に型システムを満たし、map Age実行時に操作上破棄するだけです。悲しいことに、map各段階で何もしなくてもリストをトラバースするため、これは当てはまりません。

多くの s が放り出される状況では、newtypeGHC が最も厳密にコンパイルされたコードを生成することも望んでいます (危険で注意深い)unsafeCoerce

unsafeCoerce :: [Int] -> [Age]

この場合unsafeCoerce、これら 2 つの型は実行時に同一であることがわかっているため、「安全」です。また、unsafeCoerce純粋に型レベルで動作し、実行時に真の no-op であるため、 とは異なりmap AgeunsafeCoerceが真にO(0)強制であることを知っています。

でもかなり危険です。

Coercible次のようなインスタンス化を許可することでこれを修正したいと考えています

instance Coercible a b => Coercible [a] [b] where coerce = unsafeCoerce

とは異なり、Haskell 型クラスの機構により、coerce安全な場合にのみ を使用できるようになりますunsafeCoerce。これが事実であることを確認するには、悪意のあるインスタンスCoercibleが構築される可能性があってはなりません。この目的のために、すべてのCoercibleインスタンスは、の使用に基づいてコンパイラによって構築されますnewtype

最後に、実際にどのように機能するかを深く掘り下げるときは、開発者が強制を許可するCoercibleかどうかに注釈を付けることができる新しい Haskell Role システムを理解する必要があります。newtypeこれは [Coercibleクラスのドキュメント] ( http://www.haskell.org/ghc/docs/7.8.1-rc2/html/libraries/base-4.7.0.0/Data-Coerce.html )で明確に概説されています。

于 2014-03-17T16:24:12.017 に答える