我只能以相当笨拙的方式在 Idris 0.9.12 中进行 rank-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 函数作为类型的同义词,例如HaskellLens
中Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
的 .
有什么办法可以补救或规避上述问题?