标题中所说的内容。如果我编写类型签名,是否可以通过算法生成具有该类型签名的表达式?
这似乎是可行的。我们已经知道,如果该类型是库函数类型签名的特例,Hoogle 可以通过算法找到该函数。另一方面,许多与一般表达式相关的简单问题实际上是无法解决的(例如,不可能知道两个函数是否执行相同的操作),因此这就是其中之一也很难令人难以置信。
同时提出几个问题可能不太好,但我想知道:
可以吗?
如果是这样,怎么办?
如果不能,是否有任何限制情况可以实现?
两个不同的表达式很可能具有相同的类型签名。你能计算出全部吗?或者甚至是其中的一些?
有人有真正可以实现这些功能的工作代码吗?
最佳答案
Djinn对 Haskell 类型的受限子集执行此操作,对应于一阶逻辑。但它无法管理递归类型或需要递归实现的类型;因此,例如,它不能编写 (a -> a) -> a
类型的术语(fix
的类型),它对应于命题“如果a意味着a,那么a”,这显然是错误的;你可以用它来证明任何事情。事实上,这就是 fix
产生 ⊥ 的原因。
如果您确实允许修复
,那么编写一个程序来给出任何类型的术语就很简单了;该程序将简单地为每种类型打印fix id
。
Djinn 主要是一个玩具,但它可以做一些有趣的事情,例如根据给定的条件为 Reader
和 Cont
派生正确的 Monad
实例return
和 (>>=)
类型。您可以通过安装 djinn 来尝试一下包,或使用lambdabot ,它将其集成为 @djinn
命令。
关于haskell - 给定 Haskell 类型签名,是否可以自动生成代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10205793/