我想制作一个给定函数类型(例如String -> Nat -> Bool
)的函数,该函数将返回与该函数类型相对应的类型的列表(例如[String, Nat, Bool]
)。这种功能的签名大概是Type -> List Type
,但我正在努力确定如何实现它。
答案 0 :(得分:3)
我不认为一般可以这样做,因为您无法在功能上进行模式匹配。您也不能检查函数的类型。那不是依赖类型。就像在Haskell或OCaml中一样,您实际上可以对函数执行的唯一操作就是将其应用于某个参数。但是,我设计了一些技巧可以做到:
myFun : {a, b : Type} -> (a -> b) -> List Type
myFun {a} {b} _ = [a, b]
现在的问题是a -> b
是唯一可以匹配任意函数的签名。但是,对于Arity大于1的函数,它当然不会表现出您想要的方式:
> myFun (+)
[Integer, Integer -> Integer] : List Type
因此有必要对自身进行某种递归调用以提取更多参数类型:
myFun : {a, b : Type} -> (a -> b) -> List Type
myFun {a} {b} _ = a :: myFun b
这里的问题是b
是任意类型,不一定是函数类型,并且我无法找出动态地检查它是否是函数的方法,因此我想就像使用Idris一样。
但是,动态检查类型(至少在我看来)不是静态类型语言所需要的功能。毕竟,静态类型化的全部目的是预先指定一个函数可以处理的参数,并在编译时防止使用无效参数的调用函数。因此,基本上您可能根本不需要它。如果您指定了更高的目标,那么可能有人会向您展示正确的实现方式。