Haskell中f x=f x的类型有什么理由?

Haskell中f x=f x的类型有什么理由?,haskell,functional-programming,Haskell,Functional Programming,Haskell给出了fx=fx类型的t1->t,但有人能解释一下原因吗 还有,任何其他的,不等价的函数有可能有相同的类型吗 f x = undefined 具有(alpha)等效类型f::t->a 如果你好奇的话,Haskell的类型系统是从。非正式地说,typechecker从对所有内容最允许的类型开始,并统一各种约束,直到保持一致(或不一致)。在本例中,最通用的类型是f::t1->t,并且没有其他约束 比照 f x = f (f x) 它具有推断类型f::t->t,由于统一了LHS上f

Haskell给出了
fx=fx
类型的
t1->t
,但有人能解释一下原因吗

还有,任何其他的,不等价的函数有可能有相同的类型吗

f x = undefined
具有(alpha)等效类型
f::t->a


如果你好奇的话,Haskell的类型系统是从。非正式地说,typechecker从对所有内容最允许的类型开始,并统一各种约束,直到保持一致(或不一致)。在本例中,最通用的类型是
f::t1->t
,并且没有其他约束

比照

f x = f (f x)

它具有推断类型
f::t->t
,由于统一了LHS上
f
的参数类型和RHS上外部
f
的参数类型。

好的,从函数定义
fx=fx
开始,让我们一步一步来看看可以推断出
f
的类型

从一个完全未指定的类型变量开始,
a
。我们能推断出更多吗?是的,我们观察到
f
是一个带一个参数的函数,因此我们可以将
a
更改为两个未知类型变量之间的函数,我们称之为
b->c
。无论
b
代表什么类型,都是参数
x
的类型;无论
c
代表什么类型,都必须是定义右侧的类型

关于右手边我们能想出什么?我们有
f
,它是我们正在定义的函数的递归引用,因此它的类型仍然是
b->c
,其中两个类型变量与
f
的定义相同。我们还有
x
,它是
f
定义范围内的一个变量,类型为
b
。将
f
应用于
x
类型检查,因为它们共享相同的未知类型
b
,结果是
c

在这一点上,所有的变量都可以组合在一起,并且没有其他限制,我们可以将类型变量设置为“正式”,最终生成
b->c
,其中两个变量都是Haskell中常见的、隐式通用量化的类型变量

换句话说,
f
是一个函数,它接受任何类型的参数并返回任何类型的值。它如何返回任何可能的类型?它不能,我们可以观察到,对它求值只会产生无限递归

出于同样的原因,任何具有相同类型的函数在求值时都将是“等价”的,即永远不会返回

更直接的版本是完全删除该参数:

foo :: a
foo = foo

…这也是普遍量化的,表示任何类型的值。这相当于
未定义

fx=fx
不是一种类型。也许你可以解释一下是什么产生了这种“理由”?吉恩?是的,其他“函数”也有可能具有相同的类型(任何生成bottom的函数都可以工作,例如
error
)。foo并不等同于未定义。foo已定义,未定义非:未定义| False=未定义