在我的申请,我建立一个类型为一些参数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
。
注:一种解决方案是使输入功能输入明确了Proxy
:foo :: Proxy d -> Proxy ('S ('S d))
和getValue :: (Proxy d1 -> Proxy d2) -> Int
,然后有getValue
应用功能'Z
。这达到了我想要的,但额外的Proxy
是烦人的。有没有办法不需要额外的Proxy
?
只是好奇:为什么不使用单身? – Alec
我已经用我的身边'Nat'值的包装单身,所以它会是一点也不麻烦,如果你要提出建议的方法。 – crockeea
问题是'代理::代理t',但你要'_Z ::代理“Z' - 所以只是定义了这样一个恒定的自己。如果你真的必须将这个工作移动到'getValue',那么你可以使用实例重叠实例化“自由”类型的变量到''Z',但它真的不值得。 – user2407038