来自函数类型的类型列表
List of types from a function type
我想创建一个给定函数类型的函数(例如 String -> Nat -> Bool
),return 对应于该函数类型的类型列表(例如 [String, Nat, Bool]
)。大概这样一个函数的签名是Type -> List Type
,但我正在努力确定它是如何实现的。
我不相信它可以在一般情况下完成,因为你不能在函数上进行模式匹配。您也不能检查函数的类型。这不是依赖类型的意义所在。就像在 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。
但是,动态类型检查(至少在我看来)并不是静态类型语言所需要的功能。毕竟静态类型的全部要点是提前指定一个函数可以处理什么样的参数并且防止在编译时调用带有无效参数的函数时间。所以基本上你可能根本不需要它。如果您指定了更宏伟的目标,可能有人会向您展示正确的实现方式。
我想创建一个给定函数类型的函数(例如 String -> Nat -> Bool
),return 对应于该函数类型的类型列表(例如 [String, Nat, Bool]
)。大概这样一个函数的签名是Type -> List Type
,但我正在努力确定它是如何实现的。
我不相信它可以在一般情况下完成,因为你不能在函数上进行模式匹配。您也不能检查函数的类型。这不是依赖类型的意义所在。就像在 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。
但是,动态类型检查(至少在我看来)并不是静态类型语言所需要的功能。毕竟静态类型的全部要点是提前指定一个函数可以处理什么样的参数并且防止在编译时调用带有无效参数的函数时间。所以基本上你可能根本不需要它。如果您指定了更宏伟的目标,可能有人会向您展示正确的实现方式。