【发布时间】:2018-06-09 19:41:21
【问题描述】:
考虑函数
f g h x y = g (g x) (h y)
它的类型是什么?显然我可以使用:t f 来查找,但是如果我需要手动推断,那么最好的方法是什么?
我展示的方法是将类型分配给参数并从那里推断 - 例如x :: a, y :: b 给了我们g :: a -> c 和h :: b -> d 对于一些c,d(来自g x,h y)然后我们继续从那里进行扣除(c = a来自g (g x) (h y) 等)。
但是,这有时会变成一团糟,而且我经常不知道如何进行进一步的扣除或在完成后如何解决。有时会发生其他问题 - 例如,在这种情况下,x 将变成一个函数,但这对我来说在作弊和查找类型之前并不明显。
是否有一种特定的算法始终有效(并且对于人类快速执行而言是合理的)?否则,我是否缺少一些启发式或提示?
【问题讨论】:
-
Haskell 使用的算法是 Algorithm W en.wikipedia.org/wiki/…
-
但我觉得它为什么会造成混乱有点奇怪。通常的想法是,您为参数分配一个类型,然后使其更具体,有时会引入新的类型变量,或者删除一些给定的两个基本相同的变量,等等。
-
@WillemVanOnsem 恐怕从来没有学过逻辑或哲学(但)这个算法对我没有任何帮助。
-
@A.Moris:嗯,我真的不明白你期望的答案是什么。引用的算法并没有变得比它应该的更复杂。有一个相当短的实现(github.com/wh5a/Algorithm-W-Step-By-Step/blob/master/…)。是的,这需要一些工作,因为通常算法必须对某些人类的“常识”进行编码,但机器没有常识。
-
我认为最好用有趣的模式启发式地思考:对于这个问题,g (g x) - 这是一个函数(因为稍后它需要 (h y) 作为参数)并且因为它递归地称为自然,它表明 g 具有类型 (a -> a)。从那里剩下的可能更容易流动?
标签: haskell types type-inference