考虑以下 SML 函数:
fn x => x x
这会产生以下错误(新泽西州标准 ML v110.72):
stdIn:1.9-1.12 Error: operator is not a function [circularity]
operator: 'Z
in expression:
x x
我有点明白为什么这是不允许的——首先,我不太确定如何写下它的类型——但这并不是完全无意义的;例如,我可以将身份函数传递给它并取回它。
这个函数有名字吗? (有没有办法用SML来表达?)
无法用具有类似 ML 类型系统的语言来表达此功能。即使使用恒等函数,它也不起作用,因为第一个x
和第二个x x
必须是该函数、类型的不同实例(_a -> _a) -> (_a -> _a)
and _a -> _a
,分别对于某些类型_a
.
事实上,类型系统的设计目的是禁止像这样的构造
(λx . x x) (λx . x x)
在无类型 lambda 演算中。在动态类型语言Scheme中,可以编写这样的函数:
(define (apply-to-self x) (x x))
并得到预期的结果
> (define (id x) x)
> (eq? (apply-to-self id) id)
#t
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)