私のアプリケーションでは、型が(パラメータ)d
の(注入)関数である式を構築しています。たとえば:注入型関数に入力を与える方法
op :: Proxy d -> Proxy ('S d)
op _ = Proxy
foo :: forall d . Proxy ('S ('S d))
foo = op $ op Proxy
私はfoo
のような式を構築した後、私はそれを解釈したいと思います:
getValue :: Proxy (d :: Nat) -> Int
getValue _ = ...
foo
を解釈するために、私はタイプのアプリケーションの構文を使用して、getValue $ foo @'Z
を呼び出すことができます。私の意図が常にこのパターンでgetValue
と呼ぶことを除いて、それはまあまあです。したがって、ユーザーにの式を'Z
に相対的に指定する必要はなく、getValue
に固有のプロパティである場合は、getValue foo
と書くことができ、おそらくは2
になると思います。
NB:foo :: Proxy d -> Proxy ('S ('S d))
とgetValue :: (Proxy d1 -> Proxy d2) -> Int
、その後、getValue
が'Z
に関数を適用している:一つの解決策はProxy
と明示的な機能入力への入力を行うことです。これは私が望むものを実現しますが、余分なものはProxy
です。この余分なものを必要としない方法はありますかProxy
?
単なる好奇心:なぜシングルトンを使用しないのですか? – Alec
私はすでにNatの値の周りにラッパーでシングルトンを使用していますので、アプローチを提案したい場合は全く問題ありません。 – crockeea
問題は 'Proxy :: Proxy t'ですが、あなたは' _Z :: Proxy 'Z'を望んでいます - それであなた自身でそのような定数を定義するだけです。この作業を 'getValue'に移さなければならない場合は、インスタンスオーバーラップを使って"自由 "型変数を' 'Z''にインスタンス化することができますが、本当に価値がありません。 – user2407038