在Idris 0.9.12中,我只能以相当笨拙的方式实现排名n类型:
tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b)
tupleId f (a, b) = (f _ a, f _ b)
在类型应用的任何位置上,我都需要下划线,因为当我尝试使嵌套的类型参数隐式时,Idris会抛出解析错误:
tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile
可能更大的问题是,我无法在高阶类型中使用类约束。我无法将以下Haskell函数翻译为Idris:
appShow :: Show a => (forall a. Show a => a -> String) -> a -> String
appShow show x = show x
这也阻止我将Idris函数用作类型的同义词,例如在Haskell中的
Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
。有什么解决或规避上述问题的方法吗?