可以在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
是否有更好的方法可以使用->
,如果没有,是否值得提出功能请求?
答案 0 :(得分:10)
以这种方式使用->
的问题在于它不是类型构造函数而是绑定器,其中域的绑定名称在范围内,因此->
本身没有直接的类型。例如,您对t
的定义不会捕获(x : Nat) -> P x
等依赖类型。
虽然它有点繁琐,但你正在做的是正确的方法。我不相信我们应该为(->)
作为一个类型构造函数制作特殊语法 - 部分原因是因为它实际上不是一个,部分是因为它感觉它会导致更多的混淆#&1 39;使用依赖类型。
答案 1 :(得分:1)
Data.Morphisms
模块提供类似这样的内容,除非你必须围绕Morphism
“newtype”进行所有包装/解包。