【发布时间】:2013-09-12 08:51:51
【问题描述】:
我正在编写一个程序,它针对给定的类型签名重构这种类型的 Haskell 表达式,例如:对于a -> b -> a,它返回\x -> \_ -> x。我已经阅读了这个问题背后的理论,并且我知道存在这种 Howard-Curry 同构。我想象我的程序可以解析输入并将其表示为术语。然后我会触发 SLD 解析,它会告诉我是否可以构造给定类型的术语(例如,对于 Pierce 来说,这是不可能的)。我还不知道如何在此解决方案期间实际创建 Haskell 表达式。我看过 djinn 的代码,但有点复杂,我想大致了解一下它是如何工作的。
【问题讨论】:
-
在人们投票结束之前,请注意理解 Dijnn 的概念是非常具体的,并且 Dijnn 的作者经常光顾 SO(并且可能不是其他更合适的网站)。
-
是的,它似乎是一个广为人知的解决这个问题的程序,但我不想复制原作者写的东西,而是想了解它是如何工作的以及为什么。它可能包含一些优化,但为了理解它们的重要性,我需要有一个大致的概念。谢谢托马斯;)
-
从类型构造 Haskell 表达式就像从 MD5 中找到的字符串 - 是一项艰巨的任务然后反转一个
-
@wit 这比破解加密哈希要容易得多。
Djinn> ? x :: a -> b -> (d -> c) -> (a -> b) -> (b -> b -> d) -> c-->x a b c d e = c (e (d a) b). -
你想构造实际的 Haskell 值还是可以打印出来的语法树?如果是后者,只需为表达式定义一个类型。最少,变量,抽象,应用程序。 SLD 解析不是获取计算内容的简单方法。你需要一个直觉逻辑的证明程序。
标签: haskell types logic type-inference