首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Miranda类型错误

Miranda类型错误
EN

Stack Overflow用户
提问于 2014-05-22 07:33:23
回答 1查看 78关注 0票数 1

谁能告诉我哪里出了问题?

代码语言:javascript
复制
b f x = f x (f x)

我的理解是:因为左边的f有一个参数,而右边有两个参数?

还有更详细的解释吗?

EN

回答 1

Stack Overflow用户

发布于 2014-05-22 07:56:38

编译器尝试推断f的类型。首先,它看到f接受一个参数x和另一个参数(f x),现在我们将其替换为y。因此,当编译器看到类似f x y的内容时,它会推断f具有a -> b -> c类型,带有x :: ay :: bf x y :: c。然后,它检查y closer,发现它的类型更具体地是b -> c,因为它已经知道f必须有第二个参数。因此它现在可以确定b ~ b -> c。这就是它必须停止的地方,为什么b也是b -> c呢?如果它一直替换b ~ b -> c,它将会有一个无限的递归来试图找出b是什么类型!这显然是行不通的,所以它抛出了一个编译错误,指出它不能构造无限类型b = b -> c (注意:错误消息可能使用与bc不同的名称)。我得到的错误消息实际上很有帮助:

代码语言:javascript
复制
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”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23795544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档