Idris - 派生扩展接口实例
Idris - derive extended interface instance
假设我有一个函数 f : Ord a => ...
需要 a
和 Ord
实例。
我可以使用
访问 Ord a
实例
f : Ord a => ...
f @{ord} ...
由于 Eq a => Ord a
,a
也需要有一个 Eq a
实例。有没有办法直接从 Ord a
检索它,而不是像下面这样做?
f : (Eq a, Ord a) => ...
f @{eq} @{ord} ...
可以使用 %implementation
,执行如下操作:
eqFromOrd : Ord a => Eq a
eqFromOrd @{ord} = %implementation
我会使用@marcosh 的解决方案,但这里有另一种解释表明我们并不严格需要 %implementation
:
eqExplicit : Eq a => Eq a
eqExplicit @{eq} = eq
eqFromOrd : Ord a => Eq a
eqFromOrd = eqExplicit
假设我有一个函数 f : Ord a => ...
需要 a
和 Ord
实例。
我可以使用
Ord a
实例
f : Ord a => ...
f @{ord} ...
由于 Eq a => Ord a
,a
也需要有一个 Eq a
实例。有没有办法直接从 Ord a
检索它,而不是像下面这样做?
f : (Eq a, Ord a) => ...
f @{eq} @{ord} ...
可以使用 %implementation
,执行如下操作:
eqFromOrd : Ord a => Eq a
eqFromOrd @{ord} = %implementation
我会使用@marcosh 的解决方案,但这里有另一种解释表明我们并不严格需要 %implementation
:
eqExplicit : Eq a => Eq a
eqExplicit @{eq} = eq
eqFromOrd : Ord a => Eq a
eqFromOrd = eqExplicit