が、私はその型シグネチャの主要部分に記載されていないいくつかのタイプの上にオーバーロードされますあいまいな関数を記述して、明示的な型のアプリケーション使用してそれを呼び出すことができます。明示的なタイプのアプリケーションではどのように特化しますか? GHC 8.0
{-# LANGUAGE ScopedTypeVariables, RankNTypes,
AllowAmbiguousTypes, TypeApplications, TypeFamilies #-}
showRead :: forall t . (Read t, Show t) => String -> String
showRead x = show (read x :: t)
showReadInt = showRead @Int
を私はしたいのですがSPECIALIZE
プラグマを使用して、Int
(私の実際のコードは実際の呼び出しサイトが別のモジュールにあります)の特殊化をshowRead
に強制してください。しかし、通常のSPECIALIZE
構文は、例えば、型シグネチャの主要部分を書くことに基づいています:
{-# SPECIALIZE showRead :: String -> String #-}
と私はt
がどうあるべきかを指定することができ、かつ予測に関するエラーを与えていない。この場合、それは曖昧です。
私は等式制約使用してみました:
{-# SPECIALISE showRead :: forall t . (Read t, Show t, t ~ Int) => String -> String #-}
をそれだけでエラーが発生しました:
• Could not deduce (Read t0) a SPECIALISE pragma for ‘showRead’ from the context: (Read t, Show t, t ~ Int) bound by the type signature for: showRead :: (Read t, Show t, t ~ Int) => String -> String at foo.hs:4:1-76 The type variable ‘t0’ is ambiguous
は、私はこれを行うことができます方法はありますか?もちろん、私はちょうどProxy
を使うことができましたが、光っている新しい方法を使わないのは残念です。
答えはわかりませんが、GHC8の新しいタイプのアプリケーション構文のおかげで、このようなあいまいな関数を使用する能力は非常に新しいことが分かります。だから答えが「それはまだサポートされていません」と驚くことはありません –
この文脈では、あなたは*引数*以上の*シグネチャ*に特化しています。タイプの専門化プロセスがここでは意味をなさないことはわかりません。 1つの選択肢は、奇妙な新しいインターフェイスを世界に提示しながら、特殊化を得るためにシーンの裏側にプロキシを使用することかもしれません(私はまだ完全には販売されていません)。 – dfeuer
@dfeuer:私は、既存の/ syntax /がそれを指定するのに適していないと思う。プロキシとあいまいな型の間の唯一の実際の違いは、型パラメータが明示的であるか暗黙的であるかです。 –