我想弄清楚为什么这段代码没有按预期工作。
我想创建一个函数run
,它将某个函数作为输入并返回应用于自身的函数。
run::(t1->t2)->t2
run a = a a
包含的类型应该是通用的,因为我希望它适用于任何东西,但是当我尝试时我遇到了无限的类型错误,我不确定为什么。
最佳答案
你说 a::t1 -> t2
。这意味着它的参数应该有 t1
类型。然后你将它应用到自身,a a
。这意味着它的参数是 a
。
所以现在我们有一个等式:参数应该同时具有类型 t1
(因为它是 a
的参数)和类型 t1 -> t2
(因为它是a
):
t1 ~ t1 -> t2
~ (t1 -> t2) -> t2
~ ((t1 -> t2) -> t2) -> t2
~ (((t1 -> t2) -> t2) -> t2) -> t2
~ ...
每一行都是通过将 t1
替换为它等于 t1 -> t2
的内容来继承上一行。没有有限类型满足给定的等式。
关于haskell - 制作在自身上运行其输入的函数时出现无限类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69968547/