谁能告诉我哪里出了问题?
b f x = f x (f x)我的理解是:因为左边的f有一个参数,而右边有两个参数?
还有更详细的解释吗?
发布于 2014-05-22 07:56:38
编译器尝试推断f的类型。首先,它看到f接受一个参数x和另一个参数(f x),现在我们将其替换为y。因此,当编译器看到类似f x y的内容时,它会推断f具有a -> b -> c类型,带有x :: a、y :: b和f x y :: c。然后,它检查y closer,发现它的类型更具体地是b -> c,因为它已经知道f必须有第二个参数。因此它现在可以确定b ~ b -> c。这就是它必须停止的地方,为什么b也是b -> c呢?如果它一直替换b ~ b -> c,它将会有一个无限的递归来试图找出b是什么类型!这显然是行不通的,所以它抛出了一个编译错误,指出它不能构造无限类型b = b -> c (注意:错误消息可能使用与b或c不同的名称)。我得到的错误消息实际上很有帮助:
Occurs check: cannot construct the infinite type: t1 = t1 -> t0
In the return type of a call of `f'
Probable cause: `f' is applied to too few arguments
In the second argument of `f', namely `(f x)'
In the expression: f x (f x)这会准确地告诉你问题在哪里,“即(f x)",并给出可能的原因"f应用于太少的参数”,说它“不能构造无限类型t1 = t1 -> t0”。
https://stackoverflow.com/questions/23795544
复制相似问题