idris - 函数类型的类型列表
问题描述
我想做一个给定函数类型(例如String -> Nat -> Bool
)的函数,它将返回与该函数类型(例如)对应的类型列表[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 一样多。
但是,类型的动态检查(至少在我看来)并不是静态类型语言所需要的功能。毕竟静态类型的全部意义在于提前指定函数可以处理什么样的参数,并防止在编译时调用带有无效参数的函数。所以基本上你可能根本不需要它。如果您指定了您的宏伟目标,那么有人可能会向您展示正确的做法。
推荐阅读
- android - AAB 文件未生成
- xcode - 从 Xcode Canvas 中的 SwiftUI 实时预览中导出图像
- reactjs - chackra ui 容器无法正常工作
- javascript - 我正在尝试创建一个正则表达式来搜索在字符串中重复的字母
- python - 关于如何索引 pandas 数据帧以及我应该如何更改代码以避免它的警告是什么
- node.js - 405 不允许在生产中使用
- vba - 将一个单元格除以另一个单元格时出现VBA溢出错误
- python - 如何检查按钮是否有效
- java - Pentaho Data Integration v9.2 在存储库探索时崩溃(Mac OS BigSur)
- html - 将行数据获取到引导模式