2016-09-07 13 views
17

が、私はその型シグネチャの主要部分に記載されていないいくつかのタイプの上にオーバーロードされますあいまいな関数を記述して、明示的な型のアプリケーション使用してそれを呼び出すことができます。明示的なタイプのアプリケーションではどのように特化しますか? 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を使うことができましたが、光っている新しい方法を使わないのは残念です。

+1

答えはわかりませんが、GHC8の新しいタイプのアプリケーション構文のおかげで、このようなあいまいな関数を使用する能力は非常に新しいことが分かります。だから答えが「それはまだサポートされていません」と驚くことはありません –

+0

この文脈では、あなたは*引数*以上の*シグネチャ*に特化しています。タイプの専門化プロセスがここでは意味をなさないことはわかりません。 1つの選択肢は、奇妙な新しいインターフェイスを世界に提示しながら、特殊化を得るためにシーンの裏側にプロキシを使用することかもしれません(私はまだ完全には販売されていません)。 – dfeuer

+1

@dfeuer:私は、既存の/ syntax /がそれを指定するのに適していないと思う。プロキシとあいまいな型の間の唯一の実際の違いは、型パラメータが明示的であるか暗黙的であるかです。 –

答えて

1

これはGHC 8.0ではサポートされていませんが、現在はproposalの対象になっており、今後のGHCでサポートされる予定です。

関連する問題