有没有一种很好的方法可以直接使用` - >`作为Idris中的函数?

时间:2014-11-23 17:38:02

标签: dependent-type idris

可以在Idris中的函数中返回一个类型,例如

t : Type -> Type -> Type
t a b = a -> b

但情况出现了(当试验编写一些解析器时)我想用->来折叠类型列表,即

typeFold : List Type -> Type
typeFold = foldr1 (->)

因此typeFold [String, Int]会给String -> Int : Type。但这并没有编译:

error: no implicit arguments allowed
    here, expected: ")",
    dependent type signature,
    expression, name
typeFold = foldr1 (->)
                   ^

但这很好用:

t : Type -> Type -> Type
t a b = a -> b

typeFold : List Type -> Type
typeFold = foldr1 t

是否有更好的方法可以使用->,如果没有,是否值得提出功能请求?

2 个答案:

答案 0 :(得分:10)

以这种方式使用->的问题在于它不是类型构造函数而是绑定器,其中域的绑定名称在范围内,因此->本身没有直接的类型。例如,您对t的定义不会捕获(x : Nat) -> P x等依赖类型。

虽然它有点繁琐,但你正在做的是正确的方法。我不相信我们应该为(->)作为一个类型构造函数制作特殊语法 - 部分原因是因为它实际上不是一个,部分是因为它感觉它会导致更多的混淆#&1 39;使用依赖类型。

答案 1 :(得分:1)

Data.Morphisms模块提供类似这样的内容,除非你必须围绕Morphism“newtype”进行所有包装/解包。